Server.Transfer Vs. Response.Redirect


263

Какая разница между Server.Transferа Response.Redirect?

  • Каковы преимущества и недостатки каждого?
  • Когда один уместен над другим?
  • Когда один не подходит?

3
Преимущества и недостатки были изложены на сайте ниже. developer.com/net/asp/article.php/3299641 Один интересный момент в этой статье заключается в том, что Server.Transfer потребляет больше ресурсов сервера по сравнению с Server.Redirect.
Рэй Лу

Server.Transfer уменьшает количество запросов страниц, так что я полагаю, что это «лучше» в этом отношении. Однако Response.Redirect может отправлять пользователя на внешний сайт, а Server.Transfer - нет.
codeConcussion

1
Если вы работаете в интегрированном режиме IIS 7, вы можете рассмотреть возможность использования Server.TransferRequestвместо Server.Transfer.
взломан

@Haacked должен был прочитать, что в начале Server.TransferRequest решил мои проблемы с веб-матрицей и iis7. Gracias. Они должны поставить это здесь.
Джейсон Себринг

Ответы:


234

Response.Redirectпросто отправляет сообщение (HTTP 302) в браузер.

Server.Transfer происходит, когда браузер ничего не знает, браузер запрашивает страницу, но сервер возвращает содержимое другой.


Работает ли это со страницами CSHTML с веб-матрицей? Я не могу заставить его работать, когда выполняю Server.Transfer на страницу CSHTML, такую ​​как Server.Transfer ("~ / somepage.cshtml", true), но, похоже, работает для других типов страниц. Да, у меня установлена ​​бритва, и страницы работают, как и ожидалось.
Джейсон Себринг

11
Эй, узнал. Вы должны использовать Server.TransferRequest для страниц веб-матрицы cshtml.
Джейсон Себринг

Server.Transfer () переносит только на физические страницы? например, если я перехожу на Server.Transfer ("default / category1.aspx"), то требуется ли иметь папку по умолчанию и страницу category1, aspx?
ihimv

95

Response.Redirect()отправит вас на новую страницу, обновит адресную строку и добавит ее в историю браузера. В вашем браузере вы можете нажать кнопку назад.

Server.Transfer()не меняет адресную строку. Вы не можете нанести ответный удар.

Я использую, Server.Transfer()когда я не хочу, чтобы пользователь видел, куда я иду. Иногда на странице типа «загрузка».

В противном случае я всегда буду использовать Response.Redirect().


75

Быть коротким: Response.Redirectпросто говорит браузеру посетить другую страницу. Server.Transferпомогает сократить запросы к серверу, сохраняет URL-адрес одинаковым и, с небольшой ошибкой, позволяет передавать строку запроса и переменные формы.

Что-то я нашел и согласен с ( источник ):

Server.Transferпохоже на то, что он отправляет пользователя на другую страницу с таким утверждением, как Server.Transfer("WebForm2.aspx"). Тем не менее, заявление имеет ряд явных преимуществ и недостатков.

Во-первых, переход на другую страницу с использованием Server.Transfer ресурсов сервера. Вместо того, чтобы сообщать браузеру о перенаправлении, он просто меняет «фокус» на веб-сервере и передает запрос. Это означает, что вы получаете не так много HTTP-запросов, что снижает нагрузку на ваш веб-сервер и ускоряет работу приложений.

Но будьте осторожны: потому что процесс передачи может работать только на тех сайтах, которые работают на сервере; Вы не можете использовать, Server.Transferчтобы отправить пользователя на внешний сайт. Только Response.Redirectмогу это сделать.

Во-вторых, Server.Transferподдерживает оригинальный URL в браузере. Это действительно может помочь оптимизировать методы ввода данных, хотя это может привести к путанице при отладке.

Это еще не все: Server.Transferметод также имеет второй параметр - «preserveForm». Если вы установите его True, используя оператор, такой как Server.Transfer("WebForm2.aspx", True), существующая строка запроса и любые переменные формы будут по-прежнему доступны для страницы, на которую вы переносите.

Например, если ваш WebForm1.aspx имеет элемент управления TextBox с именем TextBox1, и вы перенесли в WebForm2.aspx с параметром preserveForm, установленным в значение True, вы сможете получить значение исходного элемента управления TextBox страницы, ссылаясь на него Request.Form("TextBox1").


10
+1 за комментарий, но это, похоже, дословно скопировано с developer.com/net/asp/article.php/3299641 . Если это из другого источника, вы должны указать это.
Джонно Нолан

... но они скопировали его, они должны ссылаться на вас.
Джонно Нолан

7
Я сказал: что-то, что я нашел и с чем согласен;
TStamper

6
Должен ссылаться на источник и использовать форматирование / выделение цитаты для скопированных частей.
Крис В. Ри

1
Как можно maintaining the original URL... ...really help streamline data entry techniques?
JohnB

36

Response.Redirect() следует использовать, когда:

  • мы хотим перенаправить запрос на несколько простых HTML-страниц на нашем сервере или на другой веб-сервер
  • мы не заботимся о том, чтобы вызывать дополнительные обращения к серверу при каждом запросе
  • нам не нужно сохранять строковые переменные и переменные формы из исходного запроса
  • мы хотим, чтобы наши пользователи могли видеть новый перенаправленный URL-адрес, с которого он перенаправлен, в своем браузере (и иметь возможность добавить его в закладки, если это необходимо)

Server.Transfer() следует использовать, когда:

  • мы хотим перенести текущий запрос страницы на другую страницу ASPX на том же сервере
  • мы хотим сохранить ресурсы сервера и избежать ненужных обращений к серверу
  • мы хотим сохранить строку запроса и переменные формы (опционально)
  • нам не нужно показывать реальный URL, куда мы перенаправили запрос в веб-браузере пользователей

2
Гораздо понятнее, для меня это лучше, чем принятый ответ.
Baljeetsingh

28

Response.Redirect перенаправляет страницу на другую страницу после того, как первая страница прибывает к клиенту. Так что клиент знает перенаправление.

Server.Transfer завершает текущее исполнение страницы. Клиент не знает перенаправление. Это позволяет передавать строку запроса и переменные формы.

Так что это зависит от ваших потребностей, чтобы выбрать, что лучше.


1
Может ли злоумышленник обойти, Response.Redirectчтобы загрузить исходную страницу, даже если я позвонил Response.Redirect?
Northben

@northben - никогда не бывает легко сказать «нет», когда речь идет о технологиях, поскольку почти все может быть скомпрометировано - но в этом случае как они могли - я бы сказал нет, они не могли… но я много раз ошибался в жизни.
Джон

23

введите описание изображения здесь

«response.redirect» и «server.transfer» помогают переносить пользователя с одной страницы на другую, пока страница выполняется. Но способ, которым они делают эту передачу / перенаправление, очень отличается.

Если вы визуальный парень и хотели бы увидеть демонстрацию, а не теорию, я бы посоветовал посмотреть нижеприведенное видео на Facebook, которое объясняет разницу более наглядно.

https://www.facebook.com/photo.php?v=762186150488997

Основное различие между ними заключается в том, кто делает перевод. В «response.redirect» передача выполняется браузером, а в «server.transfer» - сервером. Попробуем разобраться в этом утверждении более подробно.

В «Server.Transfer» следующая последовательность передачи:

1. Пользователь отправляет запрос на страницу ASP.NET. На рисунке ниже запрос отправляется в «WebForm1», и мы хотим перейти к «Webform2».

2.Сервер начинает выполнение «Webform1» и запускается жизненный цикл страницы. Но до завершения полного жизненного цикла страницы происходит «Server.transfer» с «WebForm2».

3. Создается объект страницы «Webform2», выполняется полный жизненный цикл страницы, а затем выводимый HTML-ответ отправляется в браузер.

введите описание изображения здесь

В «Response.Redirect» следующая последовательность событий для навигации:

1. Клиент (браузер) отправляет запрос на страницу. На рисунке ниже запрос отправляется в «WebForm1», и мы хотим перейти к «Webform2».

2. Запускается цикл «Webform1». Но между жизненным циклом происходит отклик Response.Redirect.

3. Теперь сервер вместо перенаправления отправляет в браузер команду HTTP 302. Эта команда сообщает браузеру, что он должен инициировать запрос GET на странице "Webform2.aspx".

4. Браузер интерпретирует команду 302 и отправляет запрос GET для «Webform2.aspx».

введите описание изображения здесь

Другими словами, «Server.Transfer» выполняется сервером, а «Response.Redirect» - браузером. «Response.Redirect» необходимо выполнить два запроса для перенаправления страницы.

Так когда же использовать «Server.Transfer» и когда использовать «Response.Redirect»?

Используйте «Server.Transfer», если вы хотите перемещаться по страницам, которые находятся на одном сервере, используйте «Response.Redirect», когда вы хотите перемещаться между страницами, которые находятся на другом сервере и в домене.

введите описание изображения здесь

Ниже приводится сводная таблица, в которой выявляются различия и в каком сценарии использовать.

введите описание изображения здесь


Полезно, когда возникают проблемы с использованием Server.Transfer и Response.Redirect stackoverflow.com/questions/1433448/thread-was-being-aborted
Kiquenet

Для Server.Transfer: тот же сервер или тот же веб-сайт IIS ?
Kiquenet

Не могли бы вы , пожалуйста , обновите следующий абзац , потому что , по крайней мере 6 символов , необходимых для моего редактирования: Другими словами «Server.Transfer» выполняется на сервере , а «Response.Redirect» выполняется Чет браузером. «Response.Redirect» необходимо выполнить два запроса для перенаправления страницы.
Пол Чунг

11

Прелесть Server.Transfer в том, что вы можете сделать с ним:

TextBox myTxt = (TextBox)this.Page.PreviousPage.FindControl("TextBoxID");

Вы можете получить что-нибудь с предыдущей страницы, используя вышеуказанный метод, если вы используете Server.Transfer, но не Response.Redirect


10

В дополнение к комментарию ScarletGarden вам также необходимо учитывать влияние поисковых систем и ваше перенаправление. Эта страница переехала навсегда? Временно? Это имеет значение.

см .: Response.Redirect против "301 перемещен навсегда" :

Мы все использовали Response.Redirect в то или иное время. Это быстрый и простой способ направить посетителей в правильном направлении, если они каким-то образом окажутся не в том месте. Но знаете ли вы, что Response.Redirect отправляет код состояния ответа HTTP «302 найдено», когда вы действительно хотите отправить «301 перемещено навсегда»?

Различие кажется небольшим, но в некоторых случаях оно может иметь большое значение. Например, если вы используете код ответа «301 Moved Permanently», большинство поисковых систем удалит устаревшую ссылку из своего индекса и заменит ее новой. Если вы используете «302 Найдено», они продолжат возвращаться к старой странице ...


Ссылка не работает. Используйте вместо этого ссылку web.archive.org .
стом

6

Передача полностью на стороне сервера. Адресная строка клиента остается постоянной. Некоторая сложность в передаче контекста между запросами. Очистка и перезапуск обработчиков страниц может быть дорогостоящим, поэтому сделайте перевод на ранней стадии разработки, например, в HttpModule во время BeginRequest. Внимательно прочитайте документы MSDN, протестируйте и поймите новые значения HttpContext.Request - особенно в сценариях обратной передачи. Обычно мы используем Server.Transfer для сценариев ошибок.

Перенаправление завершает запрос со статусом 302 и ответом на обратную сторону на стороне клиента с использованием внутренней исключительной ситуации (незначительное попадание на сервер - зависит от того, сколько вы делаете в день). Затем клиент переходит на новый адрес. Адресная строка браузера, обновления истории и т. Д. Клиент оплачивает дополнительную поездку туда и обратно - стоимость варьируется в зависимости от времени ожидания. В нашем бизнесе мы много перенаправляем, мы написали свой собственный модуль, чтобы избежать стоимости исключений.


6

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

//This will work.
Response.Redirect("http://www.google.com");

//This will not work.
Server.Transfer("http://www.google.com");

5

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

Server.Transfer более эффективен, однако может немного вводить пользователя в заблуждение, поскольку URL-адрес не изменяется физически.

По моему опыту, разница в производительности не была достаточно значительной, чтобы использовать последний подход


4

Server.Transfer не изменяет URL в браузере клиента, поэтому браузер фактически не знает, что вы перешли на другой обработчик на стороне сервера. Response.Redirect сообщает браузеру перейти на другую страницу, поэтому URL в заголовке заголовка изменяется.

Server.Transfer немного быстрее, поскольку он позволяет избежать одного обращения к серверу, но неизменное изменение url может быть как хорошим, так и плохим, в зависимости от того, что вы пытаетесь сделать.


4

Response.Redirect: сообщает браузеру, что запрашиваемую страницу можно найти в новом месте. Затем браузер инициирует другой запрос на новую страницу, загружая ее содержимое в браузер. Это приводит к двум запросам браузера.

Server.Transfer: переносит выполнение с первой страницы на вторую страницу на сервере. Что касается клиента браузера, он сделал один запрос, и начальная страница отвечает за содержание. Преимущество такого подхода заключается в том, что клиентский браузер позволяет совершать еще одну поездку на сервер. Кроме того, любые опубликованные переменные формы и параметры строки запроса также доступны для второй страницы.


3

Просто подробнее о Transfer (), это на самом деле Server.Execute () + Response.End (), его исходный код ниже (из Mono / .net 4.0):

public void Transfer (string path, bool preserveForm)
{
    this.Execute (path, null, preserveForm, true);
    this.context.Response.End ();
}

а для Execute () то, что нужно запустить, является обработчиком заданного пути, см.

ASP.NET не проверяет, что текущий пользователь авторизован для просмотра ресурса, доставленного методом Execute . Хотя логика авторизации и аутентификации ASP.NET выполняется до вызова исходного обработчика ресурса, ASP.NET напрямую вызывает обработчик, указанный методом Execute, и не перезапускает логику аутентификации и авторизации для нового ресурса. Если политика безопасности вашего приложения требует, чтобы клиенты имели соответствующую авторизацию для доступа к ресурсу, приложение должно вызвать повторную авторизацию или предоставить настраиваемый механизм контроля доступа.

Вы можете принудительно выполнить повторную авторизацию, используя метод Redirect вместо метода Execute . Redirect выполняет клиентское перенаправление, при котором браузер запрашивает новый ресурс. Поскольку это перенаправление является новым запросом, поступающим в систему, на него распространяется вся логика проверки подлинности и авторизации как IIS, так и политики безопасности ASP.NET.

- из MSDN


2

Response.Redirect включает в себя дополнительную обратную передачу и обновляет адресную строку.

Server.Transfer не вызывает изменение адресной строки, сервер отвечает на запрос контентом с другой страницы

например

Response.Redirect: -

  1. На клиенте браузер запрашивает страницу http: //InitiallyRequestedPage.aspx
  2. На сервере отвечает на запрос 302, передавая адрес перенаправления http: //AnotherPage.aspx .
  3. На клиенте браузер делает второй запрос по адресу http: //AnotherPage.aspx .
  4. На сервере отвечает контент с http: //AnotherPage.aspx

Server.Transfer: -

  1. На клиентском браузере запрашивает страницу http: //InitiallyRequestedPage.aspx
  2. На сервере Server.Transfer to http: //AnotherPage.aspx
  3. На сервере выполняется ответ на запрос http: //InitiallyRequestedPage.aspx с возвратом содержимого из http: //AnotherPage.aspx.

Response.Redirect

Плюсы: - RESTful - меняет адресную строку, адрес можно использовать для записи изменений состояния между запросами.

Минусы: - Низкая - Существует дополнительная двусторонняя связь между клиентом и сервером. Это может быть дорого, если между клиентом и сервером существует значительная задержка.

Server.Transfer

Плюсы: - Быстро.

Минусы: - Состояние потеряно - Если вы используете Server.Transfer, чтобы изменить состояние приложения в ответ на обратную передачу, если страница затем перезагрузится, это состояние будет потеряно, так как адресная строка будет такой же, как была по первому запросу.


0

Response.Redirect Response.Redirect () отправит вас на новую страницу, обновит адресную строку и добавит ее в историю браузера. В вашем браузере вы можете нажать кнопку назад. Он перенаправляет запрос на несколько простых HTML-страниц на нашем сервере или на другой веб-сервер. Это вызывает дополнительные обращения к серверу при каждом запросе. Он не сохраняет Query String и Form Variables из исходного запроса. Это позволяет увидеть новый перенаправленный URL-адрес, где он перенаправлен в браузере (и иметь возможность добавить его в закладки, если это необходимо). Отклик. Redirect просто отправляет сообщение в браузер (HTTP 302).

Server.Transfer Server.Transfer () не меняет адресную строку, мы не можем нанести ответный удар. Следует использовать Server.Transfer (), когда он / она не хочет, чтобы пользователь видел, куда он идет. Когда-нибудь на странице типа «загрузка». Он передает текущий запрос страницы на другую страницу ASPX на том же сервере. Это сохраняет ресурсы сервера и позволяет избежать ненужных обращений к серверу. Он сохраняет Query String и Form Variables (опционально). Он не показывает реальный URL, куда он перенаправляет запрос в веб-браузер пользователя. Server.Transfer происходит, когда браузер ничего не знает, браузер запрашивает страницу, но сервер возвращает содержимое другой.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.