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