ASP.NET обработка ошибок с более чем одним элементом управления AJAX

#asp.net #exception-handling

#asp.net #исключение

Вопрос:

Кратко:
У меня проблема, когда при выполнении действия на странице ASPX дважды выдается исключение.

Подробности:
У меня есть два ASP.NET Элементы управления (Intersoft Webgrids). Эти элементы управления привязаны к двум разным наборам данных, и когда я нажимаю кнопку «Выполнить», обновляется сетка № 1, которая затем автоматически каскадируется и обновляет (или очищает) сетку № 2 одновременно. Две сетки обновляются с использованием AJAX «FlyPostback» от Intersoft, который, похоже, очень похож на ASP.NET Панели обновления AJAX, т.е. весь ASP.NET жизненный цикл продолжается (Page_Load и все такое).

Все мои страницы наследуются от базовой страницы, которая переопределяет onError. Затем onError зарегистрирует ошибку, очистит ее и перенаправит на страницу ошибки. На странице ошибки показан красиво отформатированный фрагмент сведений об исключении.

Мой метод onError выглядит примерно так

 Session["lastError"] = Server.GetLastError();
Server.ClearError();//Have tried with and without this
this.ErrorPage = "ErrorPage.aspx";
Response.Redirect(this.ErrorPage, true);
  

Проблема:
Когда после нажатия кнопки «Выполнить» возникает исключение, я, кажется, дважды перенаправляюсь на страницу ошибки. При первом перенаправлении я вижу (через отладчик), что получаю правильное исключение на странице ошибки, но затем я снова перенаправляюсь на страницу ошибки, и на этот раз у меня нет сведений об исключении. Я не наблюдаю эту проблему только с одной веб-сеткой. Мне кажется, что вторая сетка также пытается обработать исключение, но первая сетка уже обработала и очистила его.

ОБНОВЛЕНИЕ: Похоже, что onError вызывается только один раз, но страница с ошибкой загружается дважды.

Вопрос:
Есть ли здесь очевидная ошибка? Есть ли лучший способ справиться с этой ситуацией? Первая сетка должна обработать исключение и прервать все остальные запросы (или, по крайней мере, позволить им делать свое дело, не беспокоя меня), но, конечно, сетка # 1 не знает, обновляется ли сетка # 2.

Комментарии:

1. В чем разница в стеке вызовов между первым и вторым исключением?

2. Кажется, что onError вызывается только один раз, но страница с ошибкой загружается дважды.

Ответ №1:

Я почти уверен, что с помощью Response.Перенаправление вызывает исключение ThreadAbortException по дизайну:

http://support.microsoft.com/kb/312629

Однако блок catch, который выглядит аналогично этому, также вызовет проблему, если он у вас есть:

 catch (Exception ex)
{
   // log or something
   throw ex;
}
  

Такое поведение приведет к удалению сведений об исключении, поскольку оно маскирует исходное исключение.

Однако, более вероятно, что здесь имеет место поведение .Redirect.

Комментарии:

1. Я не вижу, чтобы какие-либо ThreadAbortExceptions вызывались или что-либо повторно вызывалось (у меня снят флажок debugging-> Just My Code, поэтому я могу видеть все). У меня все еще та же проблема, если я не завершаю запрос, т. е. Ответ. Перенаправление («ErrorPage.aspx», false).

2. В меню Debug попробуйте зайти в Exceptions и установите флажок ‘Throwned’ рядом с Common Language Runtime Exceptions; это остановит сайт при возникновении любого исключения, независимо от того, обрабатывается оно или нет.

3. этот параметр уже отмечен, и у меня все еще есть проблема, если я не перенаправляю с помощью «end request» = true.

4. Просто для ясности, при установленном этом параметре вы по-прежнему не видите второго исключения, но оно дважды загружает страницу с ошибкой?

5. похоже, что это так — если только отладчик не вызывает каких-либо асинхронных побочных эффектов, но даже без отладки я вижу, что регистрируется только одно исключение.