IIS กำลังแทนที่เนื้อหาการตอบกลับของฉันหากฉันตั้ง Response.StatusCode ด้วยตนเอง


20

ปัญหา

เมื่อฉันตั้งค่าHTTP Statusกระแสการตอบสนองของฉันด้วยตนเองพูด404หรือ503IIS ทำให้เนื้อหา / มุมมอง IIS หุ้นแทนมุมมองที่กำหนดเองของฉัน

เมื่อฉันทำเช่นนี้กับเซิร์ฟเวอร์การพัฒนาเว็บ (AKA. Cassini ) มันทำงานได้อย่างถูกต้อง (นั่นคือเนื้อหาของฉันจะปรากฏขึ้นและresponse.statuscode== ข้อมูลที่ฉันป้อน)

มีวิธีใดบ้างที่ฉันจะสามารถแทนที่พฤติกรรมนี้ได้?

วิธีการทำซ้ำ

ทำแอปพลิเคชันเว็บ ASP.NET MVC1 เริ่มต้น เพิ่มเส้นทางต่อไปนี้

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",
        "{*catchall}",
        new { controller = "Home", action = "Index" }
        );

}

ตอนนี้แทนที่วิธีดัชนีของ HomeController ด้วย ...

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        Response.StatusCode = 404;
        return View();
    }
}

คำตอบ:


18

ตกลง - พบคำตอบ อย่างที่ฉันคาดไว้ IIS กำลังจี้การตอบสนองที่ไม่ใช่ 200 ไม่แน่ใจ (เช่นฉันไม่แน่ใจว่านี่เป็นพฤติกรรมเริ่มต้นหรือเป็นเพราะการตั้งค่าหนึ่งในสมาชิกในทีมที่อัปเดตในการกำหนดค่าเครื่อง ฯลฯ ... )

อย่างไรก็ตามกุญแจสำคัญในที่นี้คือบอกให้ IIS ไม่จัดการทรัพยากรผลลัพธ์ที่ไม่ใช่ 200

อย่างไร? กำหนดค่ารายการใน web.config

<system.webServer>
    <httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough"/>
    .... snipped other IIS relevant elements ... 
</system.webServer>

existingResponse="PassThrough"ตอนนี้ที่สำคัญที่นี่คือ เด็กเลวรายนั้นบอกให้ IIS ปล่อยทรัพยากรของฉันไว้ตามลำพังหากรหัสสถานะ HTTP! = 200

ต้องการข้อมูลเพิ่มเติมหรือไม่ แน่นอนว่า: อ่านเพิ่มเติมเกี่ยวกับองค์ประกอบนี้บน IIS เว็บไซต์อย่างเป็นทางการ


httpErrorsเป็นเหมือนหน้าข้อผิดพลาด -> 500 -> แก้ไขการตั้งค่าคุณสมบัติ -> "ข้อผิดพลาดรายละเอียด" _http: //stackoverflow.com/questions/2640526/detailed-500-error-message-asp-iis-7-5_
Kiquenet

aaaahhh .. ดี 'ol IIS ทำสิ่งที่ง่ายยาก :)
AR

4

อีกวิธีในการเลี่ยงผ่านสิ่งนี้คือการเรียกใช้รหัสต่อไปนี้ในแอปพลิเคชัน ASP ของคุณ:

Response.TrySkipIisCustomErrors = true;

ที่มา: /programming//a/21271085/238753


-2

ระวังวิธีการนั้นโดยทั่วไป คุณไม่ควรแสดงสถานะ 404

  • ฉันคิดว่าเมื่อมีการส่งคืนรหัสสถานะข้อผิดพลาด IIS จะส่งคืนหน้าข้อผิดพลาดสถานะที่ลงทะเบียนไว้ - ไม่ใช่เอาต์พุตจากการประมวลผล ดังนั้นคุณสามารถใส่หน้า HTML ที่นั่น (หรือลิงค์ไปยังหน้า aspx) http://professionalaspnet.com/archive/2008/02/13/Enforcing-a-Custom-404-Page-in-ASP.NET.aspx มีคำอธิบายที่ดีเกี่ยวกับการตั้งค่าหน้าข้อผิดพลาด

  • แต่นั่นไม่เกี่ยวข้อง เบราว์เซอร์จำนวนมากโดยค่าเริ่มต้นจะไม่แสดงผลลัพธ์นั้น แต่มีบางสิ่งที่ตั้งค่าไว้ในเบราว์เซอร์ ดังนั้นหากคุณพึ่งพาผู้คนที่เห็นหน้าเว็บ 404 ของคุณนั่นอาจไม่เกิดขึ้น พวกเขาอาจเห็นหน้า 404 ที่ติดตั้งในเบราว์เซอร์สำหรับพวกเขา


1
เหตุใดฉันจึงไม่ควรแสดงมุมมองบน 404 ฉันต้องการหน้ากำหนดเองและหน้าของฉันอาจต้องใช้ตรรกะบางอย่าง (แทนที่จะเป็นหน้าข้อผิดพลาด html คงที่)
Pure.Krome

ecause รุ่น MVC ไม่รวมเข้ากับรุ่นหน้าข้อผิดพลาด IIS ง่าย ๆ คุณต้องกลับไปใช้รุ่น IIS สำหรับสิ่งนั้น ลงทะเบียน URL หน้าสำหรับเคส 404 วางหน้าแบบไดนามิกไว้ที่นั่น - ฉันไม่แน่ใจว่าจริง ๆ แล้วมันสามารถชี้ไปที่ URL MVC ได้หรือไม่ แต่มันเป็น MUST ที่มาจากการลงทะเบียน 404 หน้า
TomTom

ไม่ถูกต้อง เบราว์เซอร์ส่วนใหญ่จะแสดงเนื้อหาของหน้าเว็บที่ส่งคืนด้วยสถานะ 404 HTTP ไม่ใช่ทั้งหมด แต่ส่วนใหญ่ นอกจากนี้ IIS โดยค่าเริ่มต้นจะเคารพรหัสสถานะตามที่กำหนดโดยรหัสใด ๆ ในไซต์. NET ตราบใดที่ไม่มีโมดูลอื่น ๆ เข้ามาแทนที่ในภายหลังในไปป์ไลน์ ดูคำตอบของผู้เขียนคำถามเกี่ยวกับสิ่งที่เกิดขึ้นในกรณีนี้
Mufasa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.