Почему Ответ. Перенаправление вызывает Систему. Поточная обработка. ThreadAbortException?

Когда я использую Ответ. Перенаправление (...) для перенаправления моей формы к новой странице я получаю ошибку:

Первое случайное исключение типа 'Система. Поточная обработка. ThreadAbortException' произошел в mscorlib.dll
Исключение типа 'Система. Поточная обработка. ThreadAbortException' произошел в mscorlib.dll, но не был обработан в пользовательском коде

Мое понимание этого - то, что ошибка вызывается веб-сервером, прерывающим остаток страницы, к response.redirect обратились.

Я знаю, что могу добавить второй параметр к Response.Redirect это называют endResponse. Если я установил endResponse на Истинный, я все еще получаю ошибку, но если я установил его на Ложь затем, я не делаю. Я вполне уверен, хотя тот, который означает, веб-сервер выполняет остальную часть страницы, я перенаправил далеко от. Который, казалось бы, был бы неэффективен по меньшей мере. Существует ли лучший способ сделать это? Что-то другое, чем Response.Redirect или есть ли способ вынудить старую страницу прекратить загружаться, где я не получу a ThreadAbortException?

227
задан Kiquenet 4 October 2015 в 23:03
поделиться

5 ответов

Правильная схема заключается в вызове перегрузки Redirect с endResponse=false и вызове, чтобы сообщить конвейеру IIS, что он должен перейти непосредственно к стадии EndRequest, как только вы вернете управление:

Response.Redirect(url, false);
Context.ApplicationInstance.CompleteRequest();

Эта запись в блоге от Thomas Marquardt содержит дополнительные детали, включая то, как обрабатывать особый случай перенаправления внутри обработчика Application_Error.

329
ответ дан 23 November 2019 в 03:48
поделиться

Именно так работает Response.Redirect(url, true). Он выбрасывает исключение ThreadAbortException, чтобы прервать поток. Просто игнорируйте это исключение. (Я предполагаю, что это какой-то глобальный обработчик ошибок/логгер, где вы его видите?)

Интересная смежная дискуссия Считается ли Response.End() вредным?

7
ответ дан 23 November 2019 в 03:48
поделиться

Вот официальная линия по проблеме (я не смог найти последнюю, но не думаю, что ситуация изменилась для более поздних версий .net)

6
ответ дан 23 November 2019 в 03:48
поделиться

Response.Redirect() выбрасывает исключение для прерывания текущего запроса.

Эта KB статья описывает такое поведение (также для методов Request.End() и Server.Transfer()).

Для Response.Redirect() существует перегрузка:

Response.Redirect(String url, bool endResponse)

Если передать endResponse=false, то исключение не будет выброшено (но среда выполнения продолжит обработку текущего запроса).

Если endResponse=true (или если используется другая перегрузка), то исключение будет выброшено и текущий запрос будет немедленно завершен.

8
ответ дан 23 November 2019 в 03:48
поделиться

У меня тоже была такая проблема. Попробуйте использовать Server.Transfer вместо Response.Redirect У меня сработало

0
ответ дан 23 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: