我无法设置 IIS 为 MVC 管道之外的错误提供自定义错误页面。如果我在控制器内抛出异常,则它是所有文件,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/* 由我的应用程序内的控制器处理。我可以做些什么来让 IIS 执行自定义错误路径,而不是向我提供标准错误页面?
这是在 Azure 上运行的 ASP.NET MVC 3。它也不能在直接的 IIS 下工作,但开发服务器会执行控制器。