我也不确定为什么您的自定义错误有时似乎会绕过,但让我向您展示我在 MVC4 网站上所做的事情。
第一,我RouteCollection
在 RouteConfig.cs 中创建了一个包罗万象的路由:
routes.MapRoute(
name: "CatchAll",
url: "{*catchall}",
defaults: new { controller = "Error", action = "Index", statusCode = 404, error = new HttpException(404, "Route not found via RouteConfig.") });
第二,我创建了一个Controller
名为Error
. 唯一的工作是处理网站中抛出的异常:
public class ErrorController : Controller
{
public ActionResult Index(int statusCode, Exception error)
{
ErrorViewModel vm = new ErrorViewModel();
vm.CurrentException = error;
vm.InnerException = error.InnerException ?? null;
vm.StatusCode = statusCode;
Response.StatusCode = statusCode;
Response.TrySkipIisCustomErrors = true;
return View(vm);
}
}
我正在使用 ErrorViewModel 来显示 HTML 源代码中的详细错误。
第三,在 中Global.asax
,我重写了Application_Error
捕获网站中每个异常的方法,并通过Error
在步骤 1 中创建的控制器处理它们:
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Server.ClearError();
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("action", "Index");
routeData.Values.Add("error", exception);
if (exception.GetType() == typeof(HttpException))
{
routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
}
else
{
routeData.Values.Add("statusCode", 500);
}
IController controller = new ErrorController();
controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
就是这样,我从 web.config 中删除了 CustomErrors 节点。这个答案的很大一部分是在这篇博文中找到的。
这
Response.TrySkipIisCustomErrors = true;
是覆盖 IIS 404 页面的关键。
希望能帮助到你!