Требование
У меня есть приложение ASP.Net MVC, которое работает с рядом различных библиотек. Как и в большинстве библиотек, различные вызовы функций могут вызывать одно из множества различных исключений.
В настоящее время, когда выдается какое-либо исключение, приложение MVC обрабатывает их и возвращает «внутреннюю ошибку сервера» (код 500) обратно клиенту (например, веб-браузер).
Это нормально для большинства случаев, однако, есть один конкретный тип исключения (в данном случае UnauthorizedAccessException
), который я хотел бы привести к статусу «Несанкционированный» (код 401) вместо ответа обычная ошибка 500.
Текущая попытка
Я провел немало исследований, и похоже, что лучший способ «поймать» все исключения и обработать их с помощью метода Application_Error
. Поэтому я попробовал следующую реализацию Application_Error
в классе MvcApplication
:
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if(ex is UnauthorizedAccessException)
{
Response.StatusCode = (int)System.Net.HttpStatusCode.Unauthorized;
}
}
Задача
Проблема здесь в том, что, хотя я могу отладить и увидеть, что Response.StatusCode
устанавливается на 401, клиент / браузер все еще получает ошибку 500.
Я ожидаю, что есть очень веская причина, почему это происходит, но я исчерпал свой мозг, размышляя над поисковыми терминами, которые дадут мне нужный мне ответ.
Вопрос
Короче говоря, что мне нужно сделать, чтобы получить поведение, которое я ищу?
Для получения дополнительной информации, в конечном счете, я хочу, чтобы UnauthorizedAccessException
работал так же, как MVC обрабатывает неаутентифицированные запросы (которые перенаправляют на страницу входа). Однако мне также нужно, чтобы он работал для запросов AJAX, так как мой javascript может проверять на наличие ошибки 401
и выполнять определенную логику (в этом случае перенаправление ответа на страницу входа в систему не работает)