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

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

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


person Brandon    schedule 09.08.2009    source источник


Ответы (4)


Это может быть не полный ответ, но из того, что я видел...

Response.Redirect фактически приводит к остановке выполнения кода путем создания исключения System.Threading.ThreadAbortException.

Вы можете убедиться в этом сами, настроив глобальную обработку ошибок в Global.Asax и протестировав Response.Redirect.

РЕДАКТИРОВАТЬ

и вот ссылка на документацию, подтверждающую мой ответ:

Перенаправление вызывает End, который по завершении вызывает исключение ThreadAbortException.

Метод HttpResponse.Redirect (строка, логическое значение) (System.Web)

person David    schedule 09.08.2009

Response.Redirect имеет перегрузку, принимающую логический аргумент, указывающий, должен ли вызов Response.Redirect заканчивать ответ. Вызов перегрузки без этого аргумента аналогичен указанию true, чтобы указать, что ответ должен закончиться.

Завершение ответа означает, что Response.End вызывается после того, как ответ был изменен для выполнения перенаправления, а Response.End вызывает ThreadAbortException для завершения текущего модуля.

Любой код после вызова Response.Redirect никогда не вызывается (если вы не укажете false в качестве дополнительного аргумента). На самом деле код в finally и некоторые обработчики catch будут выполняться, но вы не можете проглотить ThreadAbortException.

person Martin Liversage    schedule 09.08.2009
comment
Если бы я не написал свой ответ на 99%, когда вы опубликовали это, я бы не стал беспокоиться о своем. Хорошая дополнительная информация об исключении ThreadAbortException. - person Jon; 10.08.2009

В Response.Redirect есть еще один параметр, который называется endResponse. Если вы выполняете перенаправление в блоке try-catch, рекомендуется установить значение false, поскольку контекст все еще нуждается в контроле, чтобы быть правильным. Таким образом, ваш блок catch получит исключение.

Предостережение заключается в том, что если страница не является отменяемой, она не будет пытаться получить контроль. Наиболее распространенным случаем этого является Global.asax. Так что вам не нужно беспокоиться об этом исключении в этом контексте. Если вы мне не верите, попробуйте отразить код этого метода и посмотреть.

Поэтому, чтобы ответить на ваш вопрос, не нужно много делать после Response.Redirect, когда вы устанавливаете для endResponse значение true, которое по умолчанию (т.е. вызывается с помощью метода, который не принимает логическое значение).

person Jon    schedule 09.08.2009

Насколько я понимаю, после выдачи Response.Redirect() код, следующий за ним, не будет выполняться. Если подумать, имело бы смысл не выполнять его. Вы в основном говорите своему коду, что хотите пойти куда-то еще.

Пример. Думайте об этом как о заказе недорогого обеда в McDonalds. После того, как вы закажете его и вам начнут наливать напиток, вы передумаете и скажете: «Знаешь что, забудь мой заказ. Я собираюсь перенаправить себя в Wendy's». В этот момент они перестанут делать вам картофель фри и гамбургер, потому что, ну... вы решили пойти куда-то еще, то есть перенаправить ответ.

person MunkiPhD    schedule 09.08.2009
comment
Мне нравится использовать реальный пример. - person David; 10.08.2009
comment
Я бы сказал, что это была аналогия, а не пример из реального мира. RWE — это то, что происходит внутри ASP.NET Framework и кода разработчика. - person Colin Mackay; 10.08.2009