Какая разница между Server.Transfer
а Response.Redirect
?
- Каковы преимущества и недостатки каждого?
- Когда один уместен над другим?
- Когда один не подходит?
Server.TransferRequest
вместо Server.Transfer
.
Какая разница между Server.Transfer
а Response.Redirect
?
Server.TransferRequest
вместо Server.Transfer
.
Ответы:
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")
.
maintaining the original URL... ...really help streamline data entry techniques
?
Response.Redirect()
следует использовать, когда:
Server.Transfer()
следует использовать, когда:
Response.Redirect перенаправляет страницу на другую страницу после того, как первая страница прибывает к клиенту. Так что клиент знает перенаправление.
Server.Transfer завершает текущее исполнение страницы. Клиент не знает перенаправление. Это позволяет передавать строку запроса и переменные формы.
Так что это зависит от ваших потребностей, чтобы выбрать, что лучше.
Response.Redirect
чтобы загрузить исходную страницу, даже если я позвонил Response.Redirect
?
«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
: тот же сервер или тот же веб-сайт IIS ?
Прелесть 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 Найдено», они продолжат возвращаться к старой странице ...
Передача полностью на стороне сервера. Адресная строка клиента остается постоянной. Некоторая сложность в передаче контекста между запросами. Очистка и перезапуск обработчиков страниц может быть дорогостоящим, поэтому сделайте перевод на ранней стадии разработки, например, в HttpModule во время BeginRequest. Внимательно прочитайте документы MSDN, протестируйте и поймите новые значения HttpContext.Request - особенно в сценариях обратной передачи. Обычно мы используем Server.Transfer для сценариев ошибок.
Перенаправление завершает запрос со статусом 302 и ответом на обратную сторону на стороне клиента с использованием внутренней исключительной ситуации (незначительное попадание на сервер - зависит от того, сколько вы делаете в день). Затем клиент переходит на новый адрес. Адресная строка браузера, обновления истории и т. Д. Клиент оплачивает дополнительную поездку туда и обратно - стоимость варьируется в зависимости от времени ожидания. В нашем бизнесе мы много перенаправляем, мы написали свой собственный модуль, чтобы избежать стоимости исключений.
Есть много различий, как указано выше. Помимо всего прочего, есть еще одно отличие. Response.Redirect()
может использоваться для перенаправления пользователя на любую страницу, которая не является частью приложения, но Server.Transfer()
может использоваться только для перенаправления пользователя в приложении.
//This will work.
Response.Redirect("http://www.google.com");
//This will not work.
Server.Transfer("http://www.google.com");
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 выполняет клиентское перенаправление, при котором браузер запрашивает новый ресурс. Поскольку это перенаправление является новым запросом, поступающим в систему, на него распространяется вся логика проверки подлинности и авторизации как IIS, так и политики безопасности ASP.NET.
- из MSDN
Response.Redirect включает в себя дополнительную обратную передачу и обновляет адресную строку.
Server.Transfer не вызывает изменение адресной строки, сервер отвечает на запрос контентом с другой страницы
например
Response.Redirect: -
Server.Transfer: -
Response.Redirect
Плюсы: - RESTful - меняет адресную строку, адрес можно использовать для записи изменений состояния между запросами.
Минусы: - Низкая - Существует дополнительная двусторонняя связь между клиентом и сервером. Это может быть дорого, если между клиентом и сервером существует значительная задержка.
Server.Transfer
Плюсы: - Быстро.
Минусы: - Состояние потеряно - Если вы используете Server.Transfer, чтобы изменить состояние приложения в ответ на обратную передачу, если страница затем перезагрузится, это состояние будет потеряно, так как адресная строка будет такой же, как была по первому запросу.
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 происходит, когда браузер ничего не знает, браузер запрашивает страницу, но сервер возвращает содержимое другой.