这就是[HandleError]
全局属性的实现方式:
public virtual void OnException(ExceptionContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (!filterContext.IsChildAction && (!filterContext.ExceptionHandled && filterContext.HttpContext.IsCustomErrorEnabled))
{
Exception innerException = filterContext.Exception;
if ((new HttpException(null, innerException).GetHttpCode() == 500) && this.ExceptionType.IsInstanceOfType(innerException))
{
string controllerName = (string) filterContext.RouteData.Values["controller"];
string actionName = (string) filterContext.RouteData.Values["action"];
HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
ViewResult result = new ViewResult {
ViewName = this.View,
MasterName = this.Master,
ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
TempData = filterContext.Controller.TempData
};
filterContext.Result = result;
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
}
请注意它如何将状态代码设置为 500 并呈现~/Views/Shared/Error.cshtml
视图。当启用自定义错误时,所有这些都会发生。
顺便说一下,这是在这种特殊情况下使用的语义正确的 HTTP 状态代码。如果您没有找到请求的资源,则为 404。仅当服务器成功处理用户请求时才应使用 200。
如果由于某种原因你不喜欢这种行为,你总是可以编写一个自定义的全局错误处理属性并替换默认的(在~/App_Start/FilterConfig.cs
->内部注册的filters.Add(new HandleErrorAttribute());
)。