ASP.NET: Что происходит с кодом после Response.Redirect(...)?
Выполняет ли Response.Redirect() прерывание текущего запущенного метода? Или код после Response.Redirect() выполняет также?
(То есть, нужно ли возвращать/выходить из Sub после Response.Redirect?)
Ответы
Ответ 1
Это может быть не полный ответ, а то, что я видел...
Response.Redirect действительно приводит к тому, что код перестает выполняться, бросая исключение System.Threading.ThreadAbortException.
Вы можете это увидеть сами, настроив глобальную обработку ошибок в Global.Asax и проверив Response.Redirect.
ИЗМЕНИТЬ
и вот ссылка на документацию, которая поддерживает мой ответ:
Переадресация вызовов Конец, который вызывает Исключение исключения ThreadAbortException завершение.
HttpResponse.Redirect Method (String, Boolean) (System.Web)
Ответ 2
Response.Redirect
имеет перегрузку, принимающую логический аргумент, который указывает, должен ли вызов Response.Redirect
завершить ответ. Вызов перегрузки без этого аргумента аналогичен указанию true
, чтобы указать, что ответ должен завершиться.
Завершение ответа означает, что Response.End
вызывается после того, как ответ был изменен, чтобы сделать перенаправление, и Response.End
выдает ThreadAbortException
для завершения текущего модуля.
Любой код после вызова Response.Redirect
никогда не вызывается (если вы не добавили false
для дополнительного аргумента). Фактически, код в finally
и некоторые обработчики catch
будут выполняться, но вы не можете усвоить ThreadAbortException
.
Ответ 3
Существует еще один параметр Response.Redirect, называемый endResponse. Установка его false - хорошая идея, когда вы перенаправляетесь в блок catch try, потому что контекст по-прежнему нуждается в правильном управлении. Таким образом, ваш блок catch получит исключение.
Предостережение заключается в том, что когда страница не отменяется, она не будет пытаться получить контроль. Наиболее распространенным случаем является Global.asax. Поэтому вам не нужно беспокоиться об этом исключении в этом контексте. Если вы не верите, что я пытаюсь отразить код этого метода и взглянуть.
Итак, чтобы ответить на ваш вопрос, не нужно делать многое после Response.Redirect, когда вы устанавливаете endResponse на true, который он по умолчанию (т.е. вызван с помощью метода, который не принимает bool).
Ответ 4
Я понимаю, что после выдачи Response.Redirect() код, следующий за ним, не будет выполняться. Если вы подумаете об этом, было бы разумно не выполнять его. Вы в основном говорите своему коду, что хотите пойти куда-то еще.
Пример: Подумайте об этом как о заказе еды в McDonalds. После того, как вы закажете его, и они начнут наполнять ваш напиток, вы передумаете и скажете: "Вы знаете, что, забудьте мой заказ. Я собираюсь перенаправить себя к Венди". В этот момент они собираются прекратить делать ваш фри и гамбургер, потому что... ну... вы решили пойти куда-то еще - то есть перенаправить ответ.