如果我手动设置Response.StatusCode,IIS将覆盖我的响应内容


20

问题

当我手动将HTTP Status响应流的设置为404或时503,IIS呈现了原始IIS内容/视图而不是自定义视图。

当我这样做与Web开发服务器(AKA。卡西尼),它工作正常(即,显示我的内容和response.statuscode==我输入的数据)。

有什么办法可以替代此行为?

如何复制

制作一个默认的ASP.NET MVC1 Web应用程序。添加以下路线

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

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

}

现在,将HomeController的Index方法替换为...

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

Answers:


18

好的-找到了答案。如我所料,IIS正在劫持我的非200个响应。不确定(即,我不确定这是否是默认行为,或者是由于设置的原因之一,是在计算机配置中更新了团队成员等)。

无论如何,这里的关键是告诉IIS 不要处理任何非200状态结果资源。

怎么样?web.config中的Config条目。

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

现在,关键是existingResponse="PassThrough"。如果HTTP状态代码!= 200,那个坏男孩告诉IIS不要理会我的资源。

需要更多信息吗?当然:请在IIS官方网站上阅读有关此元素的更多信息


httpErrors就像错误页面-> 500->编辑功能设置->“详细错误”一样
__http

aaaahhh ..好的IIS使简单的事情变得困难:)
AR


-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

因为MVC模型未与IIS错误页面模型集成。这么简单。您必须为此返回IIS模型。注册404案例的页面URL。在此处放置一些动态页面-我不确定这是否可以实际指向MVC网址,但它必须起源于404页面注册。
TomTom 2010年

不正确 大多数浏览器将呈现以404 HTTP状态返回的页面内容。不是全部,而是大多数。此外,默认情况下,只要没有其他模块在管道中覆盖其他模块,则IIS默认情况下将遵循.NET站点中任何代码所设置的状态代码。在这种情况下,请参阅问题作者的回答。
Mufasa 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.