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