使用MVC 4应用程序中的自定义错误处理UnauthorizedAccessException

时间:2013-03-28 11:57:32

标签: 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)来为每个服务器错误显示友好的错误消息。

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

这似乎适用于大多数异常,我得到了预期的行为,因为正在显示自定义错误页面View(共享视图文件夹中的Error.cshtml)。

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

我对此感到有点难过,因为在fiddler中我看到这个UnauthorizedAccessException异常会返回一个普通的500内部服务器错误,因为标准异常会发生错误。

那么我的customError设置如何遵守标准异常但是UnauthorizedAccessException不会?

我怎样才能使它们表现相同,因为它们本质上都是一个我想阻止最终用户看到的错误。

2 个答案:

答案 0 :(得分:1)

这篇博文向我提供了异常处理的概述,使我能够决定如何处理unauthorizedAccessException,这实际上意味着在Application_OnStart中处理它们。

http://prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc

出于我的目的,使用HandleErrorAttribute和全局Application_OnStart处理错误似乎没什么意义,所以出于我的目的,我认为最好处理Application_OnSTart中的所有内容,

答案 1 :(得分:0)

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

    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()));
        }
    }

您引用的文章是更好地解释错误处理技术的绝佳资源,但也应予以考虑。