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

Response.Redirect не завершение исполнения

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

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

Но перенаправление все еще началось - как только я закончу работу по остальной части BasePage, страница "Discontinued" начнет загружаться в результате перенаправления.

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

4b9b3361

Ответ 1

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

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

?

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

response.end()

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

response.flush()

Ответ 5

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

Response.End()

Ответ 6

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

HttpContext.Current.Response.Redirect("/login", true);
throw new Exception("Unauthorized Access");