【问题标题】:ASP.NET MVC 4 Catch-all only firing on local, not on remote requestsASP.NET MVC 4 Catch-all 仅在本地触发,而不是在远程请求上触发
【发布时间】:2013-04-24 07:07:27
【问题描述】:

在一个 ASP.NET MVC 4 应用程序中,我们设置了一个包罗万象的路由,如下所示:

routes.MapRoute( 
     name: "UnKnown",  
     url: "{*url}",  
     defaults: new { controller = "CatchAll", action = "UnknownUrl" });

CatchAllController 中的 UnknownUrl 方法在我们的开发环境中正确加载其视图。

但是,如果不存在的远程请求到达,生产 IIS 7.5 会显示其标准 404 页面。 本地请求,在服务器本身上使用 RDP 发送,工作正常

web.config 设置为 tp

<customErrors mode="Off"/>

本地调用和远程调用之间还有什么区别?我们如何让 MVC HttpHandler 捕获这些请求?

提示可能是我们也无法让 IIS 在远程调用时显示任何详细的状态 500 错误消息。

【问题讨论】:

    标签: asp.net-mvc iis asp.net-mvc-4 iis-7.5


    【解决方案1】:

    我遇到了 IIS 显示默认错误而不是 .NET 错误的问题,我已在 web.config 中的 system.webServer 中使用以下内容进行了修复:

    <httpErrors existingResponse="PassThrough"/>
    

    我认为如果在您的UnknownUrl 操作中设置Response.StatusCode = 404;,就会发生这种情况。默认情况下,IIS 会看到您返回错误代码,因此会显示默认错误消息,您可以使用该配置设置覆盖它。

    我不确定这在本地 v 远程上会有所不同,但值得一试。

    【讨论】:

    • 非常酷。这为我们做到了,也解决了错误问题!
    • 顺便说一句,为了允许 httpErrors 部分中的设置,在 IIS 7.0 中,可能必须执行 cd C:\Windows\System32\inetsrv 和 appcmd unlock config /section:httpErrors,如 @987654321 中所述@.
    • 感谢@Olaf 的加入
    【解决方案2】:

    您可以尝试设置主机标头吗 - 我相信这是导致本地和生产之间差异的原因:

    new { controller = "CatchAll", action = "UnknownUrl", host = HttpContext.Current.Request.Url.Host}
    

    Global.asax的Application_BeginRequest注册这条路由。此外,请确保仅执行一次 - 可能通过类似于以下内容的检查:

    if (routes["UnKnown"] == null)
            {
                routes.MapRoute( 
                    name: "UnKnown",  
                    url: "{*url}",
                    defaults: new { controller = "CatchAll", action = "UnknownUrl", host = HttpContext.Current.Request.Url.Host}
                );
            }
    

    【讨论】:

    • 谢谢。我们添加了这个,但它会引发错误,说“请求在此上下文中不可用”(德语:“Anforderung steht in diesem Kontext nicht zur Verfügung”)。有什么想法吗?
    • 哦,好吧,那是因为在 Application_Start 期间 HttpContext 不可用。您可能可以在 Global.asax 中的“void Application_BeginRequest()”中映射这个“包罗万象”的路线。
    • 我已经编辑了答案,如果它有效,请告诉我。谢谢!
    • 太糟糕了 - 它仍然无法正常工作。将其放入 Application_BeginRequest 不起作用,因此我们通过阅读 web.config 手动设置主机。但仍然是旧的 404。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    相关资源
    最近更新 更多