ASP.NET MVC 4 Catch-all仅在本地而非远程请求上触发

时间:2013-04-24 07:07:28

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

在ASP.NET MVC 4应用程序中,我们设置了一个catch-all路由,如下所示:

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错误消息。

2 个答案:

答案 0 :(得分:3)

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

<httpErrors existingResponse="PassThrough"/>

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

我不确定本地v遥控器会有什么不同,但值得一试。

答案 1 :(得分:1)

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

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}
            );
        }