IIS đang ghi đè nội dung phản hồi của tôi, nếu tôi tự đặt Phản hồi.StatusCode


20

Vấn đề

khi tôi đặt thủ công HTTP Statusluồng phản hồi của mình thành, giả sử, 404hoặc 503IIS sẽ hiển thị nội dung / chế độ xem IIS thay vì chế độ xem tùy chỉnh của tôi.

Khi tôi làm điều này với máy chủ phát triển web (AKA. Cassini ), nó hoạt động chính xác (nghĩa là nội dung của tôi được hiển thị và response.statuscode== dữ liệu đã nhập của tôi).

Có cách nào tôi có thể ghi đè hành vi này không?

Làm thế nào để nhân rộng

Tạo một ứng dụng web ASP.NET MVC1 mặc định. Thêm tuyến đường sau

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

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

}

Bây giờ thay thế phương thức Index của HomeContoder bằng ...

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

Câu trả lời:


18

Ok - tìm thấy câu trả lời. Như tôi dự đoán, IIS đang chiếm đoạt 200 phản hồi của tôi. Không chắc chắn (ví dụ: Tôi không chắc đây có phải là hành vi mặc định HOẶC đó là do cài đặt một trong các thành viên trong nhóm được cập nhật trong cấu hình máy, v.v ...).

Dù sao, chìa khóa ở đây là bảo IIS không xử lý bất kỳ tài nguyên kết quả trạng thái không 200 nào.

Làm sao? Mục cấu hình trong web.config.

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

Bây giờ, chìa khóa ở đây là existingResponse="PassThrough". Kẻ xấu đó bảo IIS hãy để tài nguyên của tôi một mình nếu mã trạng thái HTTP! = 200.

Muốn biết thêm thông tin? Chắc chắn: Đọc thêm về Yếu tố này trên Trang web IIS chính thức .


httpErrors cũng giống như trang Lỗi -> 500 -> Edit Settings Feature -> "Lỗi Chi tiết" _http: //stackoverflow.com/questions/2640526/detailed-500-error-message-asp-iis-7-5_
Kiquenet

aaaahhh .. Tốt ol 'IIS làm mọi thứ dễ dàng khó khăn :)
AR


-2

Hãy cẩn thận với cách tiếp cận đó nói chung. Bạn KHÔNG nên hiển thị chế độ xem trên trạng thái 404.

  • Tôi nghĩ rằng khi mã trạng thái lỗi được trả về, IIS sẽ trả về trang lỗi trạng thái đã được đăng ký với nó - chứ không phải đầu ra từ quá trình xử lý. Vì vậy, bạn có thể đặt một trang HTML ở đó (hoặc liên kết đến trang aspx). http: // prof Professionaspnet.com/archive/2008/02/13/Enforcing-a-Custom-404-Page-in-ASP.NET.aspx có một lời giải thích hay về cách thiết lập trang lỗi.

  • Nhưng đó là không liên quan. Khá nhiều trình duyệt theo mặc định KHÔNG hiển thị đầu ra đó, nhưng một cái gì đó được đặt trong trình duyệt. Vì vậy, nếu bạn dựa vào những người nhìn thấy trang 404 của bạn - điều đó có thể không xảy ra. Họ có thể thấy trang 404 được thiết lập trong trình duyệt cho họ.


1
Tại sao tôi không nên hiển thị chế độ xem trên 404? tôi muốn một trang tùy chỉnh và trang của tôi có thể yêu cầu một số logic (thay vì trang lỗi html tĩnh).
Pure.Krom

vì mô hình MVC không tích hợp với mô hình trang lỗi IIS. Thật đơn giản. Bạn đã quay trở lại mô hình IIS cho điều đó. Đăng ký một URL trang cho trường hợp 404. Đặt một số trang động ở đó - Tôi không chắc liệu điều này có thực sự quay lại url MVC hay không, nhưng nó bắt nguồn từ việc đăng ký trang 404.
TomTom

Sai. Hầu hết các trình duyệt sẽ hiển thị nội dung của một trang được trả về với trạng thái HTTP 404. Không phải tất cả, nhưng hầu hết. Ngoài ra, IIS theo mặc định sẽ tôn trọng mã trạng thái như được đặt bởi bất kỳ mã nào trong trang web .NET, miễn là không có mô-đun nào khác ghi đè lên sau đó trong đường ống. Xem câu trả lời của tác giả về cách điều đó đã xảy ra trong trường hợp này.
Mufasa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.