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

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

问题

当我手动将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();
    }
}

答案1

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

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

怎么样?在 web.config 中配置条目。

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

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

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

答案2

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

Response.TrySkipIisCustomErrors = true;

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

答案3

总体来说,使用这种方法时要小心谨慎。您不应该在 404 状态下呈现视图。

  • 我认为当返回错误状态代码时,IIS 将返回注册的状态错误页面 - 而不是处理的输出。因此,您可以在那里放置一个 HTML 页面(或指向 aspx 页面的链接)。 http://professionalaspnet.com/archive/2008/02/13/Enforcing-a-Custom-404-Page-in-ASP.NET.aspx 对如何设置错误页面有很好的解释。

  • 但那无关紧要。相当多的浏览器默认不显示该输出,而是显示浏览器中设置的内容。因此,如果您指望人们看到您的 404 页面 - 那可能不会发生。他们可能会看到浏览器中为他们设置的 404 页面。

相关内容