Обработка исключения UnauthorizedAccessException с пользовательскими ошибками в приложении MVC 4

Я включил глобальную обработку ошибок для приложения, применив атрибут HandleError в регистрации filterConfig.

 public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
}

Затем я использую пользовательские ошибки (web.config), чтобы, надеюсь, отображать понятное сообщение об ошибке для каждой ошибки сервера.

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

Это, казалось, работало нормально для большинства исключений, и я получил ожидаемое поведение в том, что отображалось пользовательское представление страницы ошибок (Error.cshtml в общей папке просмотра).

Однако недавно я заметил, что это не то поведение, которое я вижу, если выданная ошибка является UnauthorizedAccessException.

Я немного озадачен этим, так как, глядя в скрипач, я вижу, что это исключение UnauthorizedAccessException возвращает обычную внутреннюю ошибку сервера 500, как это делает стандартное исключение.

Так почему же стандартное исключение соответствует моей настройке customError, а UnauthorizedAccessException — нет?

И как я могу заставить их вести себя одинаково, поскольку они оба по сути являются ошибкой, которую я хочу, чтобы конечный пользователь не видел.


comment
посмотрите на этот вопрос stackoverflow.com /вопросы/12183653/   -  person polybios    schedule 28.03.2013


Ответы (2)


Этот пост в блоге предоставил мне обзор обработки исключений, чтобы я мог решить, как обрабатывать неавторизованное исключение доступа, что, по сути, означает их обработку в Application_OnStart.

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

Для моих целей нет особого смысла обрабатывать ошибки с помощью атрибута HandleErrorAttribute и в глобальном Application_OnStart, поэтому для моих целей я решил, что лучше всего обрабатывать все в Application_OnSTart,

person Kramer00    schedule 28.03.2013

Если вы просто хотите, чтобы «необработанные» исключения, такие как 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()));
        }
    }

Статья, на которую вы ссылаетесь, является отличным ресурсом для более подробного объяснения методов обработки ошибок, и ее также следует учитывать.

person Christopher King    schedule 03.03.2015