Использование HandleErrorAttribute в приложении ASP.NET MVC
У меня есть вопрос о том, как лучше всего использовать HandleErrorAttribute в моем приложении MVC 5. Как мы знаем, мы можем добавить этот атрибут в такие глобальные фильтры:
filters.Add(new HandleErrorAttribute{View = "Error"});
Это подразумевает, что приложение отображает представление "Ошибка" каждый раз, когда на любом уровне приложения возникает необработанное исключение. Но если у меня есть какая-то логика в другом глобальном фильтре авторизации или действия, который выдает какое-то исключение, то, когда исключение выдается впервые, приложение пытается перенаправить в представление ошибок, снова другие фильтры начинают выполняться и выдают то же исключение опять же, поэтому asp.net, чтобы избежать зацикливания, завершает работу приложения. Итак, каков наилучший способ использовать этот атрибут HandleErrorAttribute, чтобы избежать такого поведения? Спасибо!
Изменить: После некоторой отладки я обнаружил, что это не обычное поведение HandleErrorAttribute, поэтому зацикливание происходит для меня, только когда я использую пользовательские маршруты, например
{key}/{controller}/{action}
и когда в логике фильтра возникает какая-то ошибка, приложение пытается перенаправить в представление ошибок, но опять начинает действовать другая логика фильтра, и я даже вижу значение "Ошибка" в параметре маршрута {key}, поэтому оно нежелательно поведение. Когда я использую маршрут по умолчанию {controller}/{action}
этого не происходит, и я точно получаю представление об ошибках, не выполняя глобальную логику фильтра во второй раз.
Ответы
Ответ 1
Вы должны обернуть логику фильтра действий внутри try
catch
, затем внутри блока catch
, перенаправить на представление Error
и передать Exception
.
Ваша единственная альтернатива - полностью отключить HandleError
и использовать событие Application_Error
внутри Global.asax для управления обработкой ошибок. Таким образом вы можете перенаправить свое действие Error
внутри, вне зависимости от того, где произошла ошибка.
Ответ 2
Мэтт прав насчет global.asax... вот пример, который я последовал
http://www.digitallycreated.net/Blog/57/getting-the-correct-http-status-codes-out-of-asp.net-custom-error-pages
Затем в каждом представлении я добавил: Response.StatusCode = 500; или какой-либо другой код, который я хотел бы показать клиенту.