Как сделать страницу catch all error, если что-то взорвется в моем приложении MVC3?


В настоящее время у меня есть моя сеть.настройка файла конфигурации, чтобы не показывать отладочную информацию. Когда возникает ошибка и что-то идет не так, эта страница отображается для моих пользователей:

Извините, произошла ошибка при обработке вашего запроса.

Это страница ошибок по умолчанию.

Как я могу перенаправить на пользовательский вид, если все идет наперекосяк в любом месте в любое время на моем сайте?

1 2

1 ответ:

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

По существу, существует два типа ошибок: Ошибка в управляемом коде, которую можно каким-то образом "поймать" с помощью кода. Во-вторых, существуют ошибки IIS, которые никогда не попадают в управляемый код, потому что связанный обработчик никогда не вызывался. Например, запрос, который не сопоставляет никакие маршруты, не вызовет никакого кода, потому что IIS предполагает, что статический ресурс был запрошенный.

Я предлагаю эти три шага, чтобы сделать обработку ошибок немного более удобной

  • Не перенаправляйте! перенаправление на ошибку нарушает HTTP. Вместо этого вы должны просто вернуть страницу на место, используя Server.Transfer или return View("..."), или записав непосредственно в поток ответов, в зависимости от того, где обрабатывается ошибка. Ключевой момент: URL не должен меняться. Смотрите, например http://www.google.com/asdf/asdf

  • Добавление и регистрация глобального фильтра это наследует HandleErrorAttribute и реализует вашу процедуру обработки ошибок (и ведения журнала). Вы можете сделать это умным, чтобы он возвращал HTML для запросов HTML и JSON для запросов JSON и т. д.

  • Настройте удаление обработчиков ошибок IIS по умолчанию, чтобы убедиться, что все ошибки идут в одно и то же место назначения, если это то, что вы хотите. Это предотвращает появление уродливых страниц ошибок IIS по умолчанию. Это можно сделать в диспетчере IIS или в web.config.