我无法将 IIS 设置为针对 MVC 管道之外的错误提供自定义错误页面。如果我在 Controller 内抛出异常,那么它就是所有文件,Application_Error 事件会处理该异常:
protected void Application_Error(object sender, EventArgs e)
{
var error = Server.GetLastError();
var routeData = new RouteData();
routeData.Values["Controller"] = "Error";
routeData.Values["Area"] = "";
routeData.Values["Exception"] = error;
if (error is HttpException)
{
switch (((HttpException)error).GetHttpCode())
{
case 401:
routeData.Values["Action"] = "NotAllowed";
break;
case 403:
routeData.Values["Action"] = "NotAllowed";
break;
case 404:
routeData.Values["Action"] = "NotFound";
break;
default:
routeData.Values["Action"] = "ServerError";
break;
}
}
else
{
routeData.Values["Action"] = "ServerError";
}
Response.Clear();
Server.ClearError();
IController controller = new ErrorController();
controller.Execute(new RequestContext(new HttpContextWrapper(((MvcApplication)sender).Context), routeData));
}
但是,如果我浏览到不存在的 URL,IIS 将处理 404 错误(或任何其他错误),为我提供标准 IIS 错误消息并完全忽略我的 web.config 设置:
<system.web>
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/error">
<error statusCode="401" redirect="/error/notallowed" />
<error statusCode="403" redirect="/error/notallowed" />
<error statusCode="404" redirect="/error/notfound" />
<error statusCode="500" redirect="/error/servererror" />
</customErrors>
</system.web>
<system.webServer>
<httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL">
<clear />
<error statusCode="401" path="/error/notallowed" />
<error statusCode="403" path="/error/notallowed" />
<error statusCode="404" path="/error/notfound" />
<error statusCode="500" path="/error/servererror" />
</httpErrors>
</system.webServer>
/error/* 由我的应用程序内的 Controller 处理。我该怎么做才能让 IIS 执行自定义错误路径,而不是向我提供标准错误页面?
这是在 Azure 上运行的 ASP.NET MVC 3。它也不能在直接的 IIS 下工作,但开发服务器确实执行 Controller 。
最佳答案
IIS 不遵循默认响应模式。您必须为每个错误添加responseMode,如下所示:
<httpErrors errorMode="Custom">
<clear />
<error statusCode="401" path="/error/notallowed" responseMode="ExecuteURL" />
<error statusCode="403" path="/error/notallowed" responseMode="ExecuteURL" />
<error statusCode="404" path="/error/notfound" responseMode="ExecuteURL" />
<error statusCode="500" path="/error/servererror" responseMode="ExecuteURL" />
</httpErrors>
为什么默认值不适用,我无法理解。
关于asp.net-mvc - 在 Azure 中启用自定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10059009/