Когда я использую Response.Redirect (...) для перенаправления моей формы на новую страницу, я получаю сообщение об ошибке:
Первое исключение типа «System.Threading.ThreadAbortException» возникло в mscorlib.dll
. Исключение типа «System.Threading.ThreadAbortException» произошло в mscorlib.dll, но не было обработано в коде пользователя.
Насколько я понимаю, эта ошибка вызвана тем, что веб-сервер прерывает оставшуюся часть страницы, на которой был вызван response.redirect.
Я знаю, что могу добавить второй параметр, Response.Redirect
который называется endResponse. Если для параметра endResponse установлено значение True, я все равно получаю сообщение об ошибке, но если установить значение False, то нет. Я почти уверен, что это означает, что веб-сервер запускает остальную часть страницы, с которой я перенаправлен. Что может показаться неэффективным, если не сказать больше. Есть лучший способ сделать это? Что-то кроме Response.Redirect
или есть способ заставить старую страницу перестать загружаться, где я не получу ThreadAbortException
?
Context.ApplicationInstance.CompleteRequest();
. Зачем? Придется ли мнеreturn
из обработчика событий условно?The old version of Redirect
фразу, которую вы используете в своем комментарии, это не значит, что MS изменила реализацию, это просто очередная перегрузка.В ASP.Net WebForms нет простого и элегантного решения
Redirect
проблемы. Вы можете выбрать между грязным решением и утомительным решениемГрязный :
Response.Redirect(url)
отправляет перенаправление в браузер, а затем выбрасывает,ThreadAbortedException
чтобы завершить текущий поток. Таким образом, никакой код не выполняется после вызова Redirect (). Недостатки: это плохая практика, и это может повлиять на производительность для уничтожения подобных потоков. Кроме того,ThreadAbortedExceptions
будет отображаться в журнале исключений.Утомительно : рекомендуемый способ - вызвать,
Response.Redirect(url, false)
а затем,Context.ApplicationInstance.CompleteRequest()
однако, выполнение кода будет продолжено, а остальные обработчики событий в жизненном цикле страницы будут по-прежнему выполняться. (Например, если вы выполняете перенаправление в Page_Load, не только будет выполняться остальная часть обработчика, также будет вызываться Page_PreRender и т. Д. - отображаемая страница просто не будет отправлена в браузер. Вы можете избежать дополнительной обработки, выполнив например, установить флаг на странице, а затем позволить последующим обработчикам событий проверить этот флаг перед выполнением какой-либо обработки.(В документации
CompleteRequest
говорится, что он « заставляет ASP.NET обходить все события и фильтрацию в цепочке выполнения конвейера HTTP ». Это может быть неправильно понято. Он обходит другие фильтры и модули HTTP, но не обходит дальнейшие события в текущем жизненном цикле страницы .)Более глубокая проблема заключается в том, что WebForms не хватает уровня абстракции. Когда вы находитесь в обработчике событий, вы уже находитесь в процессе создания страницы для вывода. Перенаправление в обработчике событий ужасно, потому что вы закрываете частично сгенерированную страницу, чтобы создать другую страницу. MVC не имеет этой проблемы, поскольку поток управления отделен от представлений рендеринга, поэтому вы можете выполнить чистое перенаправление, просто возвращая
RedirectAction
в контроллере, не генерируя представление.источник
Я знаю, что опоздал, но у меня когда-либо была эта ошибка, только если я
Response.Redirect
вTry...Catch
блоке.Никогда не помещайте Response.Redirect в блок Try ... Catch. Это плохая практика
редактировать
В ответ на комментарий @ Kiquenet вот что я бы сделал в качестве альтернативы помещению Response.Redirect в блок Try ... Catch.
Я бы разбил метод / функцию на два этапа.
Первый шаг внутри блока Try ... Catch выполняет запрошенные действия и устанавливает значение «result», указывающее на успех или неудачу действий.
Шаг два за пределами блока Try ... Catch выполняет перенаправление (или не делает) в зависимости от значения «result».
Этот код далек от совершенства и, вероятно, его не следует копировать, поскольку я его не проверял
источник
Response.Redirect()
выдает исключение для отмены текущего запроса.Это KB статья описывает это поведение ( в том числе для
Request.End()
иServer.Transfer()
методов).Ибо
Response.Redirect()
существует перегрузка:Если вы передаете endResponse = false , то исключение не (но среда выполнения продолжит обработку текущего запроса).
Если endResponse = true (или если используется другая перегрузка), генерируется исключение, и текущий запрос будет немедленно прекращен.
источник
Вот официальная строка по проблеме (я не смог найти последнюю версию, но я не думаю, что ситуация изменилась для более поздних версий .net)
источник
I think that links are fantastic, but they should never be the only piece of information in your answer.
Это просто как
Response.Redirect(url, true)
работает. Это бросает,ThreadAbortException
чтобы прервать поток. Просто игнорируйте это исключение. (Я предполагаю, что это какой-то глобальный обработчик ошибок / регистратор, где вы его видите?)Интересная связанная дискуссия считается ли
Response.End()
вредной? ,источник
Также я попробовал другое решение, но некоторые из кода выполняются после перенаправления.
Так что если нужно предотвратить выполнение кода после перенаправления
источник
я даже пытался избежать этого, на всякий случай делая прерывание в потоке вручную, но я предпочитаю оставить его с «CompleteRequest» и двигаться дальше - мой код имеет команды возврата после перенаправлений в любом случае. Так что это можно сделать
источник
Что я делаю, так это ловлю это исключение вместе с другими возможными исключениями. Надеюсь, это поможет кому-то.
источник
У меня тоже была эта проблема.
Попробуйте использовать
Server.Transfer
вместоResponse.Redirect
Работал на меня.
источник