Response.Redirect не окончание выполнения - PullRequest
13 голосов
/ 17 декабря 2008

У меня есть страница Default.aspx, которая наследуется от BasePage.cs, которая наследуется от System.Web.UI.Page. BasePage - это то, где я делаю некоторые общие вещи, которые каждая страница должна делать при загрузке.

В BasePage, допустим, я проверяю X. Если X = 1, я сразу же перенаправлю на страницу Discontinued.aspx и остановлю выполнение BasePage. Если я найду X = 1, я скажу:

HttpContext.Current.Response.Redirect («Discontinued.aspx», true);

Я хочу, чтобы перенаправление остановило выполнение BasePage и сразу же выпрыгнуло - отсюда и «true» в приведенном выше утверждении - которое должно остановить выполнение текущей страницы, как я понимаю. Проблема в том, что это не так. Я ожидаю, что редирект вызовет "исключение прерывания потока".

Когда я работаю в режиме отладки, он продолжает шагать, как будто он не просто перенаправляет и уходит.

Но перенаправление все еще было запущено - как только я завершил пошаговое выполнение оставшейся части BasePage, страница «Снятая с производства» затем начинает загружаться в результате перенаправления.

Есть ли причина, по которой мой Redirect не будет прерывать выполнение BasePage?

Ответы [ 6 ]

31 голосов
/ 17 декабря 2008

Второй параметр для Response.Redirect - endResponse, однако во всплывающей подсказке указано «Указывает, следует ли прекратить выполнение текущей страницы». Это вводит в заблуждение, потому что выполнение страницы фактически не прекращается, когда переменная равна true. Это завершит выполнение любого кода. Однако, что происходит иначе, события Render отменяются, и Response немедленно сбрасывается с перемещенным заголовком объекта.

Вам необходимо вручную выйти из любых методов, Response.Redirect / Response.End не сделает этого за вас. Кроме того, если вам нужно условие, чтобы увидеть, была ли страница перенаправлена, проверьте Response.IsRequestBeingRedirected.

10 голосов
/ 17 декабря 2008

вы выходите из функции, которая вызывает перенаправление, например,

...redirect(stopit,true);
return;

2 голосов
/ 17 декабря 2008

Возможно, вы вызываете метод Response.Redirect внутри блока try {} catch {}, попробуйте его, вызвав его вне этого блока, и вы увидите, что он не завершится с ошибкой. Больше информации: http://www.velocityreviews.com/forums/t72105-responseredirect-in-a-trycatch.html Надеюсь, это поможет.

1 голос
/ 20 февраля 2015

Вы можете выдать исключение, которое завершит выполнение кода, но все равно перенаправит:

HttpContext.Current.Response.Redirect("/login", true);
throw new Exception("Unauthorized Access");
1 голос
/ 17 декабря 2008

Я за это проголосую! Прокляни мое невежество ...

Очевидно, что вы можете попробовать добавить следующую строку после перенаправления (как указано в рекурсивном коде),

response.end()

Но, возможно, причина, по которой response.redirect не сразу вызывает перенаправление, состоит в том, что у вас включена буферизация ответа (по умолчанию), и обработка страницы не заканчивается до тех пор, пока буфер не будет очищен. Если бы это было правдой (и, по общему признанию, я тоже ленивый попробую), то добавление следующей строки также решило бы вашу проблему.

response.flush()
0 голосов
/ 17 декабря 2008

Для безусловного завершения вы можете попробовать

Response.End()
...