服务器。转移Vs.响应。重定向

Server.TransferResponse.Redirect之间的区别是什么?

  • 它们各自的优点和缺点是什么?
  • 什么时候一种比另一种更合适?
  • 什么时候不合适?
241712 次浏览

Response.Redirect简单地向浏览器发送一个消息302 (HTTP)

Server.Transfer发生在浏览器一无所知的情况下,浏览器请求一个页面,但服务器返回另一个页面的内容。

响应。重定向的代价更大,因为它向服务器添加了额外的行程,以确定要去哪里。

服务器。传输是更有效的,但它可能会误导用户,因为Url没有物理改变。

根据我的经验,性能上的差异还没有大到可以使用后一种方法

传输完全是服务器端的。客户端地址栏保持不变。请求之间上下文的传输有些复杂。刷新和重新启动页面处理程序可能是昂贵的,所以在管道的早期进行传输,例如在BeginRequest期间的HttpModule中。仔细阅读MSDN文档,并测试和理解HttpContext的新值。请求——特别是在回发场景中。我们通常使用服务器。转换为错误场景。

重定向以302状态终止请求,客户端往返响应并在内部吃掉一个异常(轻微的服务器性能打击-取决于你每天做多少)客户端然后导航到新地址。浏览器地址栏&历史更新等。客户端支付额外的往返费用-费用取决于延迟。在我们的业务中,我们重定向很多,我们编写自己的模块以避免异常成本。

Response.Redirect()将把你发送到一个新页面,更新地址栏并将其添加到浏览器历史记录中。在浏览器上,您可以单击返回。

Server.Transfer()不会改变地址栏。你不能反击。

当我不想让用户看到我要去哪里时,我使用Server.Transfer()。有时在“加载”类型的页面上。

否则,我将始终使用Response.Redirect()

响应。重定向将页面重定向到另一个页面第一页到达客户端。所以客户端知道重定向。

服务器。传输退出页面的当前执行。客户端不知道重定向。它允许您传输查询字符串和表单变量。

所以这取决于你的需要来选择哪个更好。

服务器。传输不会改变客户端浏览器中的URL,因此实际上浏览器并不知道您更改了另一个服务器端处理程序。响应。重定向告诉浏览器移动到另一个页面,因此标题栏中的url会发生变化。

服务器。传输稍微快一点,因为它避免了到服务器的一次往返,但不更改url可能对您有好处,也可能有坏处,这取决于您想要做什么。

除了ScarletGarden的评论,你还需要考虑搜索引擎和你的重定向的影响。这个页面永久移动了吗?暂时的?这很重要。

看到:响应。重定向vs。“301永久移动”:

我们都使用响应。在重定向 总有那么一次。这是快速的 也很容易让访客有针对性 在正确的方向上 在错误的地方结束。但是你呢 知道答案。重定向发送 HTTP响应状态代码“302” 当你真的想要的时候 发送“301永久移动”?< / p > 区别似乎很小,但在 在某些情况下,它实际上可以 很大的差别。例如,如果你 使用“301永久移动”响应 代码,大多数搜索引擎都会删除 索引和中的过期链接 把它换成新的。如果你 使用“302 Found”,他们会继续

.返回到旧页面

简而言之:Response.Redirect只是告诉浏览器访问另一个页面。Server.Transfer有助于减少服务器请求,保持URL相同,并通过一些错误打击,允许您传输查询字符串和表单变量。

我发现并同意():

Server.Transfer与此类似,它将用户发送到另一个页面 使用Server.Transfer("WebForm2.aspx")之类的语句。然而, 这句话有许多明显的优点和缺点 首先,使用Server.Transfer转移到另一个页面 节约服务器资源。而不是告诉浏览器 重定向,它只是改变“焦点”在Web服务器和 传输请求。这意味着你不会得到那么多的HTTP 请求通过,从而减轻你的压力

. Web服务器,使您的应用程序运行更快 但是要注意:因为“转移”过程只能在这些上起作用 服务器上运行的站点;你不能使用Server.Transfer来发送 用户访问外部站点。只有Response.Redirect可以这样做 其次,Server.Transfer维护浏览器中的原始URL。 这确实有助于简化数据输入技术,尽管可能会这样

这还不是全部:Server.Transfer方法还有第二个 参数——“preserveForm”。如果使用语句将其设置为True 例如Server.Transfer("WebForm2.aspx", True),现有的查询 字符串和任何表单变量仍然对页面可用

例如,如果您的WebForm1。aspx有一个TextBox控件叫做 TextBox1和你转移到WebForm2。aspx与preserveForm 参数设置为True时,您将能够检索 原始页面文本框控件的引用 Request.Form("TextBox1") . < / p >

Response.Redirect()应该在以下情况下使用:

  • 我们希望将请求重定向到我们服务器上的一些普通HTML页面或其他web服务器
  • 我们不关心在每个请求上引起到服务器的额外往返
  • 我们不需要保留原始请求中的查询字符串和表单变量
  • 我们希望我们的用户能够看到新的重定向URL,他在他的浏览器重定向(并能够收藏它,如果它的必要)

Server.Transfer()应该在以下情况下使用:

  • 我们希望将当前页面请求传输到同一服务器上的另一个.aspx页面
  • 我们希望保留服务器资源并避免到服务器的不必要的往返
  • 我们想保留查询字符串和表单变量(可选)
  • 我们不需要在用户的Web浏览器中显示我们重定向请求的真实URL

响应。重定向:告诉浏览器可以在新的位置找到所请求的页面。然后,浏览器向新页面发起另一个请求,在浏览器中加载其内容。这将导致浏览器产生两个请求。

服务器。传输:它将执行从服务器上的第一页转移到第二页。就浏览器客户端而言,它只发出一个请求,初始页面就是响应内容的页面。 这种方法的好处是减少了一次从客户机浏览器到服务器的往返。此外,任何提交的表单变量和查询字符串参数也可用于第二个页面。< / p >

服务器之美。转移是你可以用它做的:

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

只要使用Server,就可以使用上述方法从上一页获取任何内容。转移但不响应。重定向

如上所述,有许多不同之处。除此之外,还有一个不同。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不会验证当前用户是否被授权查看执行方法交付的资源。尽管ASP。NET授权和身份验证逻辑在调用原始资源处理程序之前运行。NET直接调用执行方法所指示的处理程序,并且不为新资源重新运行身份验证和授权逻辑。如果应用程序的安全策略要求客户端具有适当的授权才能访问资源,则应用程序应该强制重新授权或提供自定义访问控制机制。

可以通过使用重定向方法而不是执行方法强制重新授权。重定向执行客户端重定向,浏览器在其中请求新资源。由于此重定向是进入系统的新请求,因此它服从Internet信息服务(IIS)和ASP的所有身份验证和授权逻辑。NET安全策略。

-从MSDN

响应。重定向涉及一个额外的往返和更新地址栏。

服务器。传输不会导致地址栏更改,服务器会用来自另一个页面的内容响应请求

如。

响应。重定向:

  1. 在客户机上,浏览器请求一个页面http://InitiallyRequestedPage.aspx
  2. 在服务器上响应请求,302传递重定向地址http://AnotherPage.aspx
  3. 在客户机上,浏览器向地址http://AnotherPage.aspx发出第二个请求。
  4. 在服务器上响应来自http://AnotherPage.aspx的内容

服务器。转让:

  1. 在客户端浏览器请求一个页面http://InitiallyRequestedPage.aspx
  2. 在服务器上。转移到http://AnotherPage.aspx
  3. 在服务器上,对http://InitiallyRequestedPage.aspx请求的响应是从http://AnotherPage.aspx传递回内容

响应。重定向

< em >优点:- RESTful -它改变地址栏,地址可以用来记录请求之间的状态变化。< / p >

< em >缺点:- 慢——在客户端和服务器之间有一个额外的往返。当客户端和服务器之间有很大的延迟时,这可能会很昂贵

服务器。转移

< em >优点:- 快。< / p > < p > 缺点: - 状态丢失-如果您正在使用服务器。传输以改变应用程序的状态以响应回发,如果页面被重新加载,该状态将丢失,因为地址栏将与第一次请求时相同

enter image description here

”反应。重定向"和"服务器。“转移”有助于在页面执行时将用户从一个页面转移到另一个页面。但是他们进行这种转移/重定向的方式非常不同。

如果你是视觉爱好者,想看演示而不是理论,我建议你看看下面的facebook视频,它以更直观的方式解释了差异。

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

他们之间的主要区别是谁来转账。在“响应。重定向“传输是由浏览器在服务器中完成的”。“传输”是由服务器完成的。让我们试着以更详细的方式来理解这句话。

在“服务器。转让”以下是转让发生的顺序:-

1.用户向ASP发送请求。网络页面。在下图中,请求被发送到“WebForm1”,我们希望导航到“Webform2”。

2.服务器开始执行“Webform1”,页面的生命周期开始。但是在页面的整个生命周期完成之前。transfer”恰好是“WebForm2”。

3.创建“Webform2”页面对象,执行整个页面生命周期,然后将输出HTML响应发送到浏览器。

enter image description here

在“回应”中。“重定向”下面是导航事件的顺序:-

1.客户端(浏览器)向页面发送请求。在下图中,请求被发送到“WebForm1”,我们希望导航到“Webform2”。

2.“Webform1”的生命周期开始执行。但在生命周期之间。重定向”发生。

3.现在,他向浏览器发送HTTP 302命令,而不是服务器执行重定向。该命令告诉浏览器必须向“Webform2”发起GET请求。aspx页面”。

4.浏览器解释302命令并为“Webform2.aspx”发送一个GET请求。

enter image description here

换句话说就是“服务器”。服务器在响应时执行“传输”。“重定向”由浏览器执行。”反应。重定向”需要两个请求来做页面的重定向。

所以什么时候使用“服务器”。转移”以及何时使用“响应”。重定向”?

使用“服务器。当您想导航位于同一服务器上的页面时,请使用“响应”。重定向"当你想在不同服务器和域上的页面之间导航时。

enter image description here

下面是一个汇总表,其中列出了不同之处以及在哪个场景中使用。

enter image description here

< >强反应。重定向 Response.Redirect()会将您发送到一个新页面,更新地址栏并将其添加到浏览器历史记录中。在浏览器上,您可以单击返回。 它将请求重定向到我们服务器上的一些普通HTML页面或其他web服务器。 它会在每个请求上导致到服务器的额外往返。 它不保留原始请求中的查询字符串和表单变量。 它可以在浏览器中看到新的重定向URL(如果有必要,还可以将其收藏起来)。 响应。重定向只是将消息发送到(HTTP 302)浏览器

< >强服务器。转移 Server.Transfer()不会改变地址栏,我们不能进行反击。当他/她不想让用户看到他要去哪里时,应该使用Server.Transfer()。有时在“加载”类型页面上。 它将当前页面请求传输到同一服务器上的另一个.aspx页面。 它保留了服务器资源并避免了到服务器的不必要的往返。 它保留查询字符串和表单变量(可选)。 它不会显示在用户Web浏览器中重定向请求的真实URL。 服务器。传输在浏览器不知情的情况下发生,浏览器请求一个页面,但服务器返回另一个页面的内容