Подтвердить что ты не робот

ASP.NET: Что происходит с кодом после Response.Redirect(...)?

Выполняет ли Response.Redirect() прерывание текущего запущенного метода? Или код после Response.Redirect() выполняет также?

(То есть, нужно ли возвращать/выходить из Sub после Response.Redirect?)

4b9b3361

Ответ 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. После того, как вы закажете его, и они начнут наполнять ваш напиток, вы передумаете и скажете: "Вы знаете, что, забудьте мой заказ. Я собираюсь перенаправить себя к Венди". В этот момент они собираются прекратить делать ваш фри и гамбургер, потому что... ну... вы решили пойти куда-то еще - то есть перенаправить ответ.