Server.Transfer Vs. Response.Redirect

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

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

16 ответов

Решение

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, куда мы перенаправили запрос в веб-браузере пользователя

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

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

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

"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 в том, что вы можете сделать с ним:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Просто подробнее о 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

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

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

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

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

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 происходит, когда браузер ничего не знает, браузер запрашивает страницу, но сервер возвращает содержимое другой.

Другие вопросы по тегам