1

我有一个 MVC4 站点,它有一个不错的 customError 页面,如果您在 IE 中关闭了友好错误但不显示您是否打开了友好错误,该页面效果很好。我不知道为什么 MVC4 在应该只显示我的错误页面时会返回 500,但它确实存在。这是一个示例(我不得不将其编写为代码,因为 SO 在 IP 号处翻转):

http://192.52.51.45/web/Trip/Index/f32e4bc5-9e06-4bb8-8d43-d43b8c9a014c

为了让网站返回 200 并只显示我的错误页面,我需要进行哪些配置更改?不是我从默认 Web.config 中获得的唯一更改是 customErrors:

<customErrors mode="On" />

谢谢您的帮助。

4

1 回答 1

4

这就是[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());)。

于 2012-06-13T12:39:26.163 回答