Asp.net mvc 在MVC 4应用程序中处理带有自定义错误的UnauthorizedAccessException

Asp.net mvc 在MVC 4应用程序中处理带有自定义错误的UnauthorizedAccessException,asp.net-mvc,asp.net-mvc-4,authorization,custom-error-pages,custom-error-handling,Asp.net Mvc,Asp.net Mvc 4,Authorization,Custom Error Pages,Custom Error Handling,我已经通过在filterConfig注册中应用HandleError属性启用了应用程序的全局错误处理 public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } } 然后我使用自定义错误(web.config)为每个服务器错

我已经通过在filterConfig注册中应用HandleError属性启用了应用程序的全局错误处理

 public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
}
然后我使用自定义错误(web.config)为每个服务器错误显示一条友好的错误消息

 <customErrors mode="On"  ></customErrors>

对于大多数异常来说,这似乎工作得很好,我得到了预期的行为,即显示自定义错误页面视图(共享视图文件夹中的error.cshtml)

但是,我最近注意到,如果抛出的错误是UnauthorizedAccessException,我就不会看到这种行为

我对此有点困惑,因为在fiddler中,我看到这个UnauthorizedAccessException异常返回一个普通的500内部服务器错误,就像标准异常一样

那么,为什么标准异常符合我的customError设置,而UnauthorizedAccessException不符合呢


我怎样才能让它们表现得一样,因为它们本质上都是一个错误,我想让最终用户看不到。

这篇博客文章为我提供了异常处理的概述,使我能够决定如何处理unauthorizedAccessException,这本质上意味着在应用程序启动时处理它们


出于我的目的,处理HandleErrorAttribute和全局应用程序启动中的错误似乎没有多大意义,因此出于我的目的,我决定最好处理应用程序启动中的所有内容,

如果您只想强制“未处理”异常,如
UnauthorizedAccessException
通过正常的自定义错误页面,则可以覆盖控制器的OneException方法,类似于以下内容:

    protected override void OnException(ExceptionContext filterContext)
    {
        base.OnException(filterContext);

        if (!filterContext.ExceptionHandled && filterContext.RequestContext.HttpContext.IsCustomErrorEnabled)
        {
            filterContext.ExceptionHandled = true;

            filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
            filterContext.Result = View("Error",
                new HandleErrorInfo(filterContext.Exception, filterContext.GetCurrentControllerName(), filterContext.GetCurrentActionName()));
        }
    }
不过,您引用的这篇文章是更全面地解释错误处理技术的绝佳资源,也应该予以考虑。

看看这个问题