Как сделать страницу с перехватом всех ошибок, если в приложении MVC3 что-то взорвалось? - PullRequest
2 голосов
/ 14 ноября 2011

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

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

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

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

1 Ответ

3 голосов
/ 14 ноября 2011

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

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

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

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

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

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

...