在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错误消息。
答案 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}
);
}