ความแตกต่างระหว่าง customErrors และ httpErrors คืออะไร?


168

ความแตกต่างระหว่างcustomErrorsและhttpErrorsส่วนของไฟล์ web.config ในแอปพลิเคชัน ASP.NET MVC คืออะไร?

แนวทางในการใช้แต่ละส่วนมีอะไรบ้าง


1
IMHO - HttpError เป็นการจัดการระดับ IIS สำหรับข้อความแสดงข้อผิดพลาดขณะที่ CustomError เป็นการจัดการ ASP.Net สำหรับข้อผิดพลาดในเว็บแอปพลิเคชัน แต่ชอบที่จะทราบข้อมูลเพิ่มเติม ...
ซันนี่

คำตอบ:


85

ข้อจำกัดความรับผิดชอบ: นี่คือจากประสบการณ์ของฉันและไม่ได้พิสูจน์ความจริง

ทั้งสองใช้เพื่อกำหนดการจัดการข้อผิดพลาดสำหรับเว็บไซต์ แต่ซอฟต์แวร์ต่างกันอ้างถึงองค์ประกอบการกำหนดค่าที่แตกต่างกัน

customErrors เป็นองค์ประกอบดั้งเดิม (เข้ากันได้ย้อนหลัง) ซึ่งใช้โดย Visual Studio Development Server (aka. VSDS หรือ Cassini)

httpErrors เป็นองค์ประกอบใหม่ที่ใช้โดย IIS7 เท่านั้น

สิ่งนี้เน้นถึงปัญหาที่เป็นไปได้เมื่อพัฒนาเว็บไซต์ ASP.NET ขณะใช้ VSDS แทน IIS ท้องถิ่น

นอกจากนี้อ้างถึงโพสต์นี้ด้วยตัวเองเกี่ยวกับวิธีการจัดการข้อความแสดงข้อผิดพลาดกับ IIS7 หากคุณต้องการควบคุมเอาท์พุทข้อผิดพลาดแบบเต็ม

สรุป:

  • การพัฒนาในการVSDSใช้งานcustomErrors
  • เผยแพร่ไซต์ที่ต้องการIIS6ใช้customErrors
  • การเผยแพร่เว็บไซต์เพื่อIIS7- httpErrorsการใช้งาน

และถ้าคุณพัฒนาด้วยVSDSแต่เผยแพร่ต่อIIS7ฉันคิดว่าคุณจะต้องใช้ทั้งคู่


30
customErrors สำหรับ asp.net httpErrors สำหรับ IIS7 และจัดการกับเนื้อหาที่ไม่ผ่านตัวจัดการ. net (เช่น. png, .js เป็นต้น) หากคุณต้องการหน้าข้อผิดพลาดสำหรับประเภทเนื้อหาที่ไม่ใช่. NET ให้ใช้หน้าข้อผิดพลาด IIS (httpErrors สำหรับ IIS7 , UI สำหรับ IIS6)
zcrar70

4
ฉันขอแนะนำให้ติดตั้งและใช้ IIS 7 Express กับ Visual Studio เพื่อการดีบัก มันจะใช้ตัวเลือกการกำหนดค่าเดียวกันกับ IIS 7 ปกติซึ่งแตกต่างจาก Cassini
ฌอน

ไม่จำเป็นต้องใช้ customErrors อีกต่อไปโดย @johnB และจำเป็นเกินไป? 1. ) เปิดใช้งาน "ส่งข้อผิดพลาดไปยังเบราว์เซอร์" ในส่วน "ASP" คุณสมบัติการดีบัก 2) ภายใต้ "หน้าข้อผิดพลาด / แก้ไขการตั้งค่าคุณสมบัติ" เลือก "ข้อผิดพลาดโดยละเอียด" 3. ) ปิดการใช้งาน "แสดงข้อความข้อผิดพลาด HTTP ที่เป็นมิตร" ใน IE stackoverflow.com/questions/2640526/…
Kiquenet

136

* อัปเดตเมื่อเมษายน 2559

แอตทริบิวต์ customErrors ใช้เมื่อรหัส. NET กำลังทำการโยนข้อยกเว้น (404, 403, 500 ฯลฯ ) และแอตทริบิวต์ httpErrors จะใช้เมื่อ IIS เองกำลังทำการยกเว้น

  • / myfakeextensionslessurl -> httpErrors 404
  • /myfakeaspsx.aspx -> customErrors 404
  • /myfakeimage.jpg -> httpErrors 404
  • /throw500.apx -> customErrors 500
  • / throw500 -> customErrors 500

มีข้อผิดพลาดมากมายที่พยายามกำหนดค่านี้อย่างถูกต้อง ดังนั้นหากคุณกำลังมองหาตัวอย่างรวดเร็วตัวเลือกที่ดีที่สุดที่คุณมีคือ:

ตัวอย่างที่ 1: การใช้หน้า html

<system.web>
  <customErrors mode="RemoteOnly" defaultRedirect="/Error500.html" redirectMode="ResponseRewrite">
    <error statusCode="403" redirect="/Error403.html" />
    <error statusCode="404" redirect="/Error404.html" />
    <error statusCode="500" redirect="/Error500.html" />
  </customErrors>
</system.web>
<system.webServer>
  <httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto">
    <remove statusCode="403" />
    <remove statusCode="404" />
    <remove statusCode="500" />
    <error statusCode="403" responseMode="File" path="Error403.html" />
    <error statusCode="404" responseMode="File" path="Error404.html" />
    <error statusCode="500" responseMode="File" path="Error500.html" />
  </httpErrors>
</system.webServer>

ตัวอย่างที่ 2: การใช้หน้า aspx

<system.web>
  <customErrors mode="RemoteOnly" defaultRedirect="/Error500.html" redirectMode="ResponseRewrite">
    <error statusCode="403" redirect="/Error403.aspx" />
    <error statusCode="404" redirect="/Error404.aspx" />
    <error statusCode="500" redirect="/Error500.aspx" />
  </customErrors>
</system.web>
<system.webServer>
  <httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto">
    <remove statusCode="403" />
    <remove statusCode="404" />
    <remove statusCode="500" />
    <error statusCode="403" responseMode="ExecuteURL" path="Error403.aspx" />
    <error statusCode="404" responseMode="ExecuteURL" path="Error404.aspx" />
    <error statusCode="500" responseMode="ExecuteURL" path="Error500.aspx" />
  </httpErrors>
</system.webServer>

และในหน้าข้อผิดพลาด aspx คุณต้องทำสิ่งนี้ (หน้า 404 ตัวอย่าง):

<% 
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true;
 %>

หมายเหตุ: ไม่สามารถใช้ URL ส่วนขยายในส่วน customErrors ได้! . (ไม่มีแฮ็ก)

สิ่งหนึ่งที่ควรแก้ไขคือการปิดการใช้งานข้อผิดพลาดที่กำหนดเองและให้ http ข้อผิดพลาดในการจัดการเพจที่กำหนดเอง เพื่อนได้สร้างการตั้งค่าดังกล่าวเมื่อฉันหาเวลาฉันจะแบ่งปันรหัส

พื้นหลัง

หน้าข้อผิดพลาดที่กำหนดเองที่ดีจะ:

  1. แสดงข้อยกเว้นจริงเมื่อคุณเยี่ยมชมหน้าปัญหาในเครื่อง
  2. แสดงหน้าแบบกำหนดเองเมื่อคุณเยี่ยมชมหน้าปัญหาจากระยะไกล
  3. จะไม่เปลี่ยนเส้นทาง แต่เพียงแสดงเนื้อหาของหน้าข้อผิดพลาด (เพราะเหตุผล seo)
  4. จะแสดงรหัสสถานะที่ถูกต้อง

ดังนั้นเพื่อชี้แจงตัวเลือกบางอย่างในการกำหนดค่าของเรา:

  1. <customErrors mode="RemoteOnly". Onคุณสามารถระบุที่นี่: Off, RemoteOnly,

    • On = แสดงหน้าข้อผิดพลาดที่กำหนดเองเสมอ
    • Off = แสดงข้อผิดพลาดจริงเสมอ
    • RemoteOnly= แสดงข้อผิดพลาดในเครื่อง แต่แสดงหน้าข้อผิดพลาดที่กำหนดเองจากระยะไกล ดังนั้นเราต้องการRemoteOnlyคำสั่ง 1
  2. <customErrors redirectMode="ResponseRewrite". คุณสามารถระบุที่นี่: หรือResponseRedirect โหมดจะเปลี่ยนเส้นทางหน้าข้อผิดพลาดไปยังหน้าข้อผิดพลาดที่กำหนดเอง สำหรับโปรแกรมรวบรวมข้อมูลลิงก์ (SEO) สิ่งนี้จะส่งผลให้ 302 -> 500 แต่คุณต้องการให้โปรแกรมรวบรวมข้อมูลลิงก์ได้รับข้อผิดพลาด 500ResponseRewriteResponseRedirect

  3. <httpErrors errorMode="DetailedLocalOnly". สิ่งนี้เทียบเท่าcustomErrorsโหมด Customตัวเลือกที่คุณได้: Detailed, DetailedLocalOnly,

โพสต์บล็อกที่ดีซึ่งช่วยฉันได้มากคือ: http://benfoster.io/blog/aspnet-mvc-custom-error-pages


customErrors ชนิดใดที่สัมพันธ์กัน - httpErrors และ IIS config เช่น"ส่งข้อผิดพลาดไปยังเบราว์เซอร์" ใน ASP - คุณสมบัติการดีบักและ "หน้าข้อผิดพลาด / แก้ไขการตั้งค่าคุณสมบัติ", "ข้อผิดพลาดโดยละเอียด" ? stackoverflow.com/questions/2640526/…
Kiquenet

36

<customErrors> กับ <httpErrors>


<customErrors>

  • ยังคงมีอยู่ใน IIS7 +
  • ระบุหน้าข้อผิดพลาดที่กำหนดเองสำหรับคำขอจัดการโดย ASP.NET
  • จัดการคำขอภายในแอปพลิเคชัน ASP.NET เท่านั้น
  • ไฟล์สแตติกเช่นไฟล์ HTML หรือไดเรกทอรี (“ เป็นมิตร”) URL จะไม่ถูกจัดการ

<httpErrors>

  • เปิดตัวใน IIS7
  • ระบุหน้าข้อผิดพลาดที่กำหนดเองสำหรับคำขอจัดการโดย IIS
  • จัดการการร้องขอภายในแอปพลิเคชัน ASP.NET และ / หรือจัดการการร้องขอภายนอก - แอปพลิเคชัน ASP.NET *
  • จัดการไฟล์และ URL ทั้งหมด *

หมายเหตุ: ไม่จำเป็นต้องใช้อีกต่อไป customErrors

แหล่งที่มาอ้างถึง: 404 ที่กำหนดเองและหน้าข้อผิดพลาดใน ASP.NET (บทความที่ยอดเยี่ยม)


ExecuteURLแสดงเนื้อหาแบบไดนามิกเช่นหน้า. aspx ( pathค่าจะต้องเป็นURL ที่เกี่ยวข้องกับเซิร์ฟเวอร์ ):

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL" >
    <remove statusCode="404"/>
    <error statusCode="404" responseMode="ExecuteURL" path="/error.aspx" />
  </httpErrors>
</system.webServer>

File ให้บริการไฟล์ข้อผิดพลาดที่กำหนดเองเช่นหน้า. html:

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="File" >
    <remove statusCode="404"/>
    <error statusCode="404" path="404.html" />
  </httpErrors>
</system.webServer>

การอ้างอิง: HTTP Errors (www.iis.net)

สำหรับรายละเอียดเพิ่มเติมอ่านลิงค์ www.iis.net ด้านบน


อาจมีประโยชน์ ** stackoverflow.com/questions/2640526/… ** ถ้ารวมhttpErrorsกับ"ส่งข้อผิดพลาดไปยังเบราว์เซอร์"และหน้าข้อผิดพลาด
Kiquenet

3
+1 สำหรับบันทึกย่อit's no loger necesary to use customErrorsและการอ้างอิงนี่เป็นข้อมูลจริง ๆ ที่ฉันได้รับหลังจาก :-)
Myster

4

ส่วนข้อผิดพลาดในการกำหนดค่าเว็บมีไว้เพื่อให้วิธีการจัดการข้อผิดพลาด http แบบกำหนดเองมีสองส่วนคือหนึ่ง customErrors ภายในส่วน system.web และ httpErrors อื่นภายในส่วน system.webServer (ตามที่ระบุด้านล่าง)

customErrors: ส่วนนี้มีการใช้งานก่อนที่จะมีการเปิดตัว IIS 7, IIS 6 5 และก่อนที่จะใช้ส่วนนี้อย่างเต็มที่สำหรับการจัดการข้อผิดพลาด http ที่กำหนดเองตามรหัสสถานะ http

httpErrors: IIS 7 และใหม่กว่าใช้ส่วนนี้รวมถึงส่วนcustomErrorsเพื่อจัดการข้อผิดพลาด http แบบกำหนดเองตามส่วนขยายของไฟล์หากมีการร้องขอการลงทะเบียนส่วนขยายของหน้ากับ ISAPI dll (.aspx, ashx, .asmx, .sx ฯลฯ ) เช่น index.aspx IIS รับการตั้งค่าจากส่วนcustomeErrorsมิฉะนั้นจะรับการตั้งค่าจากhttpErrors (ต้องมีการตั้งค่าโหมดโฮสต์ IIS 7 เป็นอารมณ์แบบรวมไม่คลาสสิค)

ด้านล่างนี้เป็นตัวอย่างสำหรับการเชื่อมโยงตรวจสอบข้อผิดพลาด 404:

httperrors vs customerrors ใน webconfig, iis, asp.net

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.