Я использую Application_Error
для обработки ошибок в приложении ASP.NET MVC 3.Сегодня я заметил, что для одного конкретного случая ошибки этот метод вызывается дважды: при запросе ресурсов с начальным подчеркиванием, например, _ViewStart.cshtml
.
Реализация Application_Error
потребляет последнюю ошибку сервера:
var exception = server.GetLastError();
server.ClearError();
...
Поэтому, когда он вызывается во второй раз, GetLastError
возвращает null
.Когда он вызывается в первый раз, он устанавливает соответствующий код состояния и содержимое объекта ответа.После второго вызова все эти настройки были перезаписаны.Чтобы обойти эту проблему, я теперь проверяю нулевой указатель:
if (exception == null) return;
Таким образом, он работает прекрасно: первый запуск метода заменяет ответ страницей с ошибкой и устанавливает код состояния.Второй прогон ничего не делает.Затем ответ отправляется клиенту, который получает правильный код состояния и страницу ошибки.
Но эта строка кода для меня выглядит грязной.Я предпочел бы понять, что происходит, а не заставлять обработчик ошибок молча завершать работу, если на самом деле что-то пошло не так.обработки.В противном случае я мог бы понять это.Но при отладке его построчно обрабатывается весь метод Application_Error
, включая вызов MVC контроллера и рендеринг представлений.Фактически, после следования комментарию gordonml и проверке флага «Разорвать, когда выбрасывается исключение CLR», Visual Studio никогда не ломалась, даже до первого вызова Application_Error.