Server.Transfer Vs. Response.Redirect

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

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

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 перенаправляет страницу на другую страницу после того, как первая страница придет к клиенту. Поэтому клиент знает redirect.

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

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

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

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

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

  • мы хотим перенести текущий запрос страницы на другую страницу .aspx на том же сервере
  • мы хотим сохранить серверные ресурсы и избежать ненужных обращений к серверу
  • мы хотим сохранить Query String и Form Variables (необязательно)
  • нам не нужно показывать реальный URL-адрес, где мы перенаправили запрос в веб-браузере пользователей

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

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

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

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

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

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

1.User отправляет запрос на страницу ASP.NET. На следующем рисунке запрос отправляется в «WebForm1», и мы хотели бы перейти к «Webform2».

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

см .: Response.Redirect vs. “301 Moved Permanentently” :

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

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

Красота Server.Transfer – это то, что вы можете с ней сделать:

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

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

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

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

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

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

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

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

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

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

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

Просто добавьте более подробную информацию о 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 выполняет redirect на стороне клиента, в котором браузер запрашивает новый ресурс. Поскольку это redirect – это новый запрос, входящий в систему, он подвергается всей логике аутентификации и авторизации как политики Internet Information Services (IIS), так и политики безопасности ASP.NET.

– от MSDN

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

 Response.Redirect(''http://www.google.com"); //This will work. Server.Transfer(''http://www.google.com"); //This will not work. 
  1. Подобно гиперссылке и Response.Redirect, Server.Transfer используется для перехода на другие страницы / сайты, запущенные на одном и том же веб-сервере.
  2. Server.Transfer не может использоваться для навигации по сайтам / страницам на другом веб-сервере.
  3. Server.Transfer не изменяет URL-адрес в адресной строке
  4. Server.Transfer быстрее, чем Response.Redirect, поскольку redirect происходит на сервере в течение одного цикла Request / Response. Response.Redirect () включает в себя 2 цикла запроса / ответа.
  5. С Server.Transfer сохраняются переменные формы из исходного запроса.

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

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

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

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

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

  • Является ли redirect 302 относительным URL действительным или недействительным?
  • Как перенаправить все HTTP-запросы на HTTPS
  • Перенаправить Runtime.getRuntime (). Exec () с помощью System.setOut ();
  • Как перенаправить URL-путь в IIS?
  • Как перенаправить на другую веб-страницу?
  • Принудительное redirect после входа в систему
  • Используя JSF 2.0 / Facelets, есть ли способ подключить глобальный прослушиватель ко всем вызовам AJAX?
  • Nodejs - перенаправить URL-адрес
  • Запрос CORS с предполетью и redirect: запрещено. Обходные?
  • Достаточно ли перенаправлять изображения HTTP?
  • Лучшая практика: 301 Перенаправление HTTP на HTTPS (стандартный домен)
  • Interesting Posts

    Какой IP-адрес возвращается службе DNS?

    Как защитить мое окно от атаки Wanna Cry (Wanna Crypt) и как удалить Wanna Cry?

    Typcript / Angular / ES6: могу ли я, наконец, позволить `hasOwnProperty ()` умереть в циклах?

    Дата метода DateFormatter (from: String) возвращает nil для определенных дат на определенных языках в Swift

    mkdir () работает во внутренней памяти флеш-памяти, но не SD-карта?

    Как пользователи / разработчики могут установить конфигурацию прокси-сервера Android для версий 2.x?

    Как программировать log4net с нуля (без конфигурации)

    Существуют ли какие-либо драйверы файловой системы Reiser для Windows XP?

    Получить местоположение пользователя по IP-адресу

    Откройте текстовый файл в VIM cygwin

    Как сделать кнопку похожим на ссылку?

    Почему «java -version» переходит в stderr?

    Как перенаправить на предыдущее действие в ASP.NET MVC?

    Массовая вставка записей в таблицу Active Record

    Тип сущности не является частью модели для текущего контекста

    Давайте будем гением компьютера.