Server.Transfer Vs. Response.Redirect

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

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

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

codeConcussion 06.02.2009 21:32

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

Haacked 12.05.2010 20:11

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

Ray Lu 22.10.2008 09:49

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

Jason Sebring 15.05.2012 05:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
268
4
225 220
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

Ответ принят как подходящий

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

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

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

Jason Sebring 15.05.2012 04:24

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

Jason Sebring 15.05.2012 05:53

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

ihimv 08.10.2015 10:38

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

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

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

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

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

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

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

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

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

Response.Redirect перенаправляет страницу на другую страницу. после первая страница приходит клиенту. Итак, клиент знает перенаправление.

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

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

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

northben 30.04.2013 18:14

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

JonH 08.11.2016 22:58

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

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

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

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

We've all used Response.Redirect at one time or another. It's the quick and easy way to get visitors pointed in the right direction if they somehow end up in the wrong place. But did you know that Response.Redirect sends an HTTP response status code of "302 Found" when you might really want to send "301 Moved Permanently"?

The distinction seems small, but in certain cases it can actually make a big difference. For example, if you use a "301 Moved Permanently" response code, most search engines will remove the outdated link from their index and replace it with the new one. If you use "302 Found", they'll continue returning to the old page...

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

stomy 19.10.2018 17:40

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

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

Server.Transfer is similar in that it sends the user to another page with a statement such as Server.Transfer("WebForm2.aspx"). However, the statement has a number of distinct advantages and disadvantages.

Firstly, transferring to another page using Server.Transfer conserves server resources. Instead of telling the browser to redirect, it simply changes the "focus" on the Web server and transfers the request. This means you don't get quite as many HTTP requests coming through, which therefore eases the pressure on your Web server and makes your applications run faster.

But watch out: because the "transfer" process can work on only those sites running on the server; you can't use Server.Transfer to send the user to an external site. Only Response.Redirect can do that.

Secondly, Server.Transfer maintains the original URL in the browser. This can really help streamline data entry techniques, although it may make for confusion when debugging.

That's not all: The Server.Transfer method also has a second parameter—"preserveForm". If you set this to True, using a statement such as Server.Transfer("WebForm2.aspx", True), the existing query string and any form variables will still be available to the page you are transferring to.

For example, if your WebForm1.aspx has a TextBox control called TextBox1 and you transferred to WebForm2.aspx with the preserveForm parameter set to True, you'd be able to retrieve the value of the original page TextBox control by referencing Request.Form("TextBox1").

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

Johnno Nolan 25.02.2009 12:58

... но они скопировали это, они должны процитировать вас.

Johnno Nolan 25.02.2009 13:03

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

TStamper 25.02.2009 18:10

Следует ссылаться на источник и использовать форматирование / выделение цитат для скопированных частей.

Chris W. Rea 18.06.2010 23:05

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

JohnB 01.12.2010 20:24

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

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

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

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

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

Baljeetsingh 28.10.2018 09:23

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

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

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

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

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

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

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

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

Просто подробнее о 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 does not verify that the current user is authorized to view the resource delivered by the Execute method. Although the ASP.NET authorization and authentication logic runs before the original resource handler is called, ASP.NET directly calls the handler indicated by the Execute method and does not rerun authentication and authorization logic for the new resource. If your application's security policy requires clients to have appropriate authorization to access the resource, the application should force reauthorization or provide a custom access-control mechanism.

You can force reauthorization by using the Redirect method instead of the Execute method. Redirect performs a client-side redirect in which the browser requests the new resource. Because this redirect is a new request entering the system, it is subjected to all the authentication and authorization logic of both Internet Information Services (IIS) and ASP.NET security policy.

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

«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.Redirectstackoverflow.com/questions/1433448/thread-was-being-aborted

Kiquenet 02.10.2015 18:56

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

Kiquenet 20.06.2016 14:58

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

paul cheung 03.11.2018 08:58

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

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

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