Сервер.Трансфер Vs. Ответ.Перенаправлять

в чем разница между Server.Transfer и Response.Redirect?

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

18 ответов


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

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


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

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

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

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


Короче говоря: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").


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

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

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


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

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

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

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

enter image description here

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

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

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

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

In " Сервер.Передача " ниже приведена последовательность того, как происходит передача: -

1.Пользователь отправляет запрос ASP.NET Пейдж. В на рисунке ниже запрос отправляется в "WebForm1", и мы хотели бы перейти к"Webform2".

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

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

enter image description here

а в "Ответ.Redirect " следующая последовательность событий для навигации: -

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

2.Запускается жизненный цикл "Webform1". Но в промежутке между жизненным циклом " ответ.Редирект " случается.

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

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

enter image description here

другими словами "сервер.Передача " выполняется сервером в то время как "ответ.Redirect " выполняется браузером thr. "Ответ.Redirect " необходимо выполнить два запроса для перенаправления страницы.

так когда использовать " сервер.Передача "и когда использовать" ответ.Перенаправлять" ?

Использовать "Сервер.Передача "если вы хотите перемещаться по страницам, которые находятся на одном сервере, используйте" ответ.Перенаправление", когда вы хотите перемещаться между страницами, которые находятся на разных серверах и доменах.

enter image description here

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

enter image description here


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

посмотреть: ответ.Редирект против "301 переехал навсегда":

мы все использовали ответ.Перенаправить на так или иначе. Это быстро. и простой способ получить посетителей указал в правильном направлении, если они как-то окажись не в том месте. Но сделал вы знайте этот ответ.Редирект отправляет Код состояния ответа HTTP " 302 Найдено " когда вы действительно захотите отправить "301 перемещен навсегда"?

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


красота сервере.Передача - это то, что вы можете с ней сделать:

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

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


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

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


ответ.Перенаправление дороже, так как оно добавляет дополнительную поездку на сервер, чтобы выяснить, куда идти.

сервер.Передача более эффективна, однако она может быть немного неправильной для пользователя, так как Url-адрес физически не изменяется.

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


сервер.Передача не изменяет URL-адрес в браузере клиента, поэтому браузер не знает, что вы изменились на другой обработчик на стороне сервера. Ответ.Перенаправление указывает браузеру перейти на другую страницу, поэтому url в заголовке изменяется.

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


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

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


подробнее о Transfer (), на самом деле это сервер.Выполнить() + Ответ.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 не проверяет, что текущий пользователь авторизован для просмотра ресурса, предоставленного выполнить метод. Хотя ASP.NET логика авторизации и аутентификации выполняется перед исходный обработчик ресурсов называется, ASP.NET непосредственно вызывает обработчик, указанный выполнить метод и не перезапускает логику аутентификации и авторизации для нового ресурса. Если политика безопасности приложения требует, чтобы клиенты имели соответствующую авторизацию для доступа к ресурсу, приложение должно принудительно выполнить повторную авторизацию или предоставить пользовательский механизм управления доступом.

вы можете принудительно изменить авторизацию с помощью редирект метод вместо выполнить метод. редирект выполняет перенаправление на стороне клиента, в котором браузер запрашивает новый ресурс. Поскольку это перенаправление является новым запросом, входящим в систему, оно подвергается всей логике проверки подлинности и авторизации служб Internet Information Services (IIS) и ASP.NET политика безопасности.

-из MSDN


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

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

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

  1. Так же, как гиперссылка и ответ.Перенаправление, Сервер.Переход используется для перехода на другие страницы/сайты, работающие на одном веб-сервере.
  2. сервер.Передача не может использоваться для перехода к сайтам / страницам на другом веб-сервере.
  3. сервер.Передача не изменяет URL в адресной строке
  4. сервер.Передача происходит быстрее, чем реакция.Перенаправление, поскольку перенаправление происходит на сервере в одном цикле запроса/ответа. Ответ.Redirect () включает в себя 2 Циклы запроса / ответа.
  5. С Сервера.Перенос переменных формы из исходного запроса сохраняется.

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

ответ.Redirect (): клиент знает физическое местоположение (имя страницы и строку запроса). Контекст.Предметы теряет настойчивость, когда ориентироваться на целевую страницу. В более ранних версиях IIS, если мы хотели отправить пользователя на новую веб-страницу, единственным вариантом был ответ.Перенаправлять. Хотя этот метод действительно достигает нашей цели, он имеет несколько важных недостатков. Самая большая проблема заключается в том, что этот метод вызывает каждая страница рассматривается как отдельная транзакция. Помимо того, что это затрудняет поддержание вашей транзакционной целостности, ответ.Redirect вводит некоторые дополнительные головные боли. Во-первых, это предотвращает хорошую инкапсуляцию кода. Во-вторых, вы теряете доступ ко всем свойствам объекта запроса. Конечно, есть обходные пути, но они трудны. Наконец, Ответ.Редирект требует поездки туда и обратно к клиенту, что на сайтах большого объема вызывает проблемы масштабируемости.


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

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

например

ответ.Редирект: -

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

сервер.Перевод:-

  1. в браузере клиента запрашивает страницу http://InitiallyRequestedPage.аспн
  2. на сервер сервер.Перевод в http://AnotherPage.аспн
  3. на сервере в ответ на запрос http://InitiallyRequestedPage.аспн передавая обратно содержимое из http://AnotherPage.аспн

ответ.Перенаправить

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

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

сервер.Перевод

плюсы:- Быстрый.

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


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

сервер.Перевод Сервер.Transfer () не меняет адресную строку, мы не можем нанести ответный удар.Нужно использовать сервер.Transfer (), когда он/она не хочет, чтобы пользователь видел, куда он идет. Когда-нибудь на странице типа" загрузка". Он передает текущий запрос страницы другому.aspx-страницы на том же сервере. Он сохраняет ресурсы сервера и избегает лишних обращений к серверу. Он сохраняет строку запроса и переменные формы (необязательно). Он не показывает реальный URL, где он перенаправляет запрос в веб-браузере пользователей. Сервер.Передача происходит без браузера, ничего не зная, браузер запрашивает страницу,но сервер возвращает содержимое другого.