ASP.NET Application_Error вызывается дважды - PullRequest
2 голосов
/ 11 июля 2011

Я использую 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.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2015

В вашем файле Web.config есть две возможности для определения пользовательских ошибок. Убедитесь, что присутствует только один из них, в противном случае соответствующие ошибки вызываются дважды.

<httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL">
  <error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" />
  ...
</httpErrors>


<customErrors mode="On">
  <error redirect="~/Error/NotFound" statusCode="404" />
  ...
</customErrors>
0 голосов
/ 06 марта 2015

То же самое произошло со мной.

Мое решение было следующее (мне это не нравится, но мне нравится больше, чем if(exception == null) return;)

В случае, еслиисключение выдается при вызове AJAX на сервер, я только что удалил Response.StatusCode = (int)401.

, который у меня был в Global.asax.cs, потому что иногда токен доступа API истекал раньше, чем сеанс http.Если я установлю Response.StatusCode = 500, Application_Error не срабатывает дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...