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

Pur*_*ome 22 windows-server-2008 iis-7.5 asp.net-mvc

问题

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

当我使用 Web 开发服务器(AKA. Cassini)执行此操作时,它可以正常工作(即显示我的内容并且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" }
        );

}
Run Code Online (Sandbox Code Playgroud)

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

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

Pur*_*ome 21

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

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

如何?web.config 中的配置条目。

<system.webServer>
    <httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough"/>
    .... snipped other IIS relevant elements ... 
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

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

想了解更多信息?当然:在官方 IIS 网站上阅读有关此元素的更多信息


小智 7

绕过此问题的另一种方法是在 ASP 应用程序中运行以下代码:

Response.TrySkipIisCustomErrors = true;
Run Code Online (Sandbox Code Playgroud)

来源:https ://stackoverflow.com/a/21271085/238753