提问



Server.TransferResponse.Redirect之间有什么区别?



  • 每个的优点和缺点是什么?

  • 什么时候适合另一个?

  • 什么时候不适合?


最佳参考


Response.Redirect只是向浏览器发送一条消息(HTTP 302)。[26]


Server.Transfer没有浏览器知道任何事情,浏览器请求页面,但服务器返回另一个页面的内容。

其它参考1


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


Server.Transfer()不会更改地址栏。你不能回击。


当我不希望用户看到我要去的地方时,我使用Server.Transfer()。有时在加载类型的页面上。


否则我将永远使用Response.Redirect()

其它参考2


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


我找到并同意的东西(来源):[27]



  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和您使用preserveForm转移到WebForm2.aspx
  参数设置为True,您将能够检索到的值
  原始页面通过引用控制TextBox
  Request.Form("TextBox1")


其它参考3


Response.Redirect将页面重定向到第一页到达客户端后的页面。所以客户端知道重定向。


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


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

其它参考4


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



  • 我们希望将请求重定向到我们服务器上的某些纯HTML页面或其他某个Web服务器

  • 我们不关心在每次请求时向服务器进行额外的往返

  • 我们不需要保留原始请求中的查询字符串和表单变量

  • 我们希望我们的用户能够在浏览器中看到重定向的新重定向网址(如果需要,可以将其加入书签)



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



  • 我们希望将当前页面请求转移到同一服务器上的另一个.aspx页面

  • 我们希望保留服务器资源并避免不必要的往返服务器

  • 我们要保留查询字符串和表单变量(可选)

  • 我们不需要在用户Web浏览器中显示我们重定向请求的真实URL


其它参考5





response.redirect和server.transfer有助于在页面执行时将用户从一个页面传输到另一个页面。但他们进行此转移/重定向的方式却截然不同。


如果你是视觉家伙,并希望看到演示而不是理论我会建议看到下面的facebook视频,以更具说明性的方式解释差异。


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


它们之间的主要区别在于谁进行了转移。在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.现在,他不是在服务器上进行重定向,而是向浏览器发送HTTP 302命令。此命令告诉浏览器他必须向Webform2.aspx页面发起GET请求。


4.Browser解释302命令并发送Webform2.aspx的GET请求。





换句话说,服务器执行Server.Transfer,而thr浏览器执行Response.Redirect。 Response.Redirect需要两个请求来重定向页面。


那么何时使用Server.Transfer以及何时使用Response.Redirect?


如果要导航位于同一服务器上的页面,请使用Server.Transfer,如果要在驻留在不同服务器和域上的页面之间导航,请使用Response.Redirect。





下面是一个汇总表,其中列出了差异以及使用的场景。




其它参考6


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


请参阅:Response.Redirect与301永久移动:[29]



  我们都使用过Response.Redirect
  一次或另一次。这很快
  并且很容易让访问者指出
  如果他们以某种方式在正确的方向
  最终在错误的地方。但是你呢?
  知道Response.Redirect发送了一个
  HTTP响应状态代码302
  发现当你真的想要的时候
  发送301永久移动?

  
  区别似乎很小,但在
  在某些情况下,它实际上可以成为
  巨大差距。例如,如果你
  使用301 Moved Permanently响应
  代码,大多数搜索引擎将删除
  他们的索引和过时的链接
  用新的替换它。如果你
  使用302 Found,他们将继续
  回到旧页面......


其它参考7


Server.Transfer的优点在于它可以用它做什么:


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


只要您使用Server.Transfer但不使用Response.Redirect,您可以使用上述方法从上一页获取任何内容

其它参考8


转移完全是服务器端的。客户端地址栏保持不变。关于请求之间的上下文传输的一些复杂性。刷新和重新启动页面处理程序可能很昂贵,因此您需要尽早在管道中进行传输,例如在BeginRequest期间的HttpModule中。仔细阅读MSDN文档,测试并理解HttpContext.Request的新值 - 尤其是在Postback场景中。我们通常使用Server.Transfer来处理错误情况。


重定向以302状态和客户端往返响应终止请求,并在内部吃掉异常(次要服务器性能命中 - 取决于您每天要做多少)客户端随后导航到新地址。浏览器地址栏&客户支付额外往返费用 - 费用因延迟而异。在我们的业务中,我们重定向很多我们编写了自己的模块以避免异常成本。

其它参考9


Response.Redirect成本更高,因为它增加了额外的服务器行程,以确定去哪里。


Server.Transfer效率更高,但由于Url不会发生物理变化,因此可能会对用户造成一些误导。


根据我的经验,性能上的差异并不足以使用后一种方法

其它参考10


Server.Transfer不会在客户端浏览器中更改URL,因此浏览器有效地不知道您已更改为另一个服务器端处理程序.Response.Redirect告诉浏览器移动到另一个页面,因此标题栏中的URL更改。


Server.Transfer稍微快一些,因为它避免了到服务器的一次往返,但是对于你来说,不更改url可能是好事还是坏事,具体取决于你要做的事情。

其它参考11


Response.Redirect:告诉浏览器可以在新位置找到所请求的页面。然后,浏览器向新页面发起另一个请求,在浏览器中加载其内容。这导致浏览器发出两个请求。


Server.Transfer:它将执行从第一页传输到服务器上的第二页。就浏览器客户端而言,它发出了一个请求,初始页面是响应内容的页面。
这种方法的好处是可以从客户端浏览器往返服务器。此外,任何发布的表单变量和查询字符串参数也可用于第二页。

其它参考12


关于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 执行客户端重定向,浏览器在该重定向中请求新资源。由于此重定向是进入系统的新请求,因此它受Internet信息服务(IIS)和ASP.NET安全策略的所有身份验证和授权逻辑的约束。

  
   - 来自MSDN [30]


其它参考13


如上所述存在许多差异。除此之外,还有一个区别。 Response.redirect()可用于将用户重定向到不属于应用程序的任何页面,但server.transfer()只能用于重定向应用程序中的用户。


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

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

其它参考14



  1. 就像超链接和Response.Redirect一样,Server.Transfer用于导航到在同一个Web服务器上运行的其他页面/站点。

  2. Server.Transfer不能用于导航到其他Web服务器上的站点/页面。

  3. Server.Transfer不会更改地址栏中的网址

  4. Server.Transfer比Response.Redirect更快,因为在一个请求/响应周期中服务器上发生重定向。 Response.Redirect()涉及2个请求/响应周期。

  5. 使用Server.Transfer保留原始请求中的表单变量。


其它参考15


Server.Transfer():客户端仅显示在请求页面上,但所有内容都是请求的页面。使用Context.Item集合可以在页面中保留数据,这是将数据从一个页面传输到另一个页面的最佳方式之一,使页面状态保持Activity状态。


Response.Redirect():客户端知道物理位置(页面名称和查询字符串)。当导航到目标页面时,Context.Items会丢失持久性。在早期版本的IIS中,如果我们想要将用户发送到新的Web页面,我们唯一的选择是Response.Redirect。虽然这种方法确实实现了我们的目标,但它有几个重要的缺点。最大的问题是此方法会将每个页面视为单独的事务。除了难以维护您的事务完整性之外,Response.Redirect还引入了一些额外的麻烦。首先,它阻止了良好的代码封装。其次,您无法访问Request对象中的所有属性。当然,有一些解决方法,但它们很难。最后,Response.Redirect需要往返客户端,在高容量站点上,会导致可伸缩性问题。

其它参考16


Response.Redirect涉及额外的往返并更新地址栏。


Server.Transfer不会导致地址栏更改,服务器会使用其他页面中的内容响应请求


例如


Response.Redirect的: -



  1. 在客户端上,浏览器请求页面http://InitiallyRequestedPage.aspx

  2. 在服务器上响应请求,302传递重定向地址http://AnotherPage.aspx。

  3. 在客户端上,浏览器向地址http://AnotherPage.aspx发出第二个请求。

  4. 在服务器上回复来自http://AnotherPage.aspx
  5. 的内容


Server.Transfer的: - [31] [32] [33] [34]



  1. 在客户端浏览器上请求页面http://InitiallyRequestedPage.aspx

  2. 在服务器Server.Transfer到http://AnotherPage.aspx

  3. 在服务器上,响应http://InitiallyRequestedPage.aspx请求从http://AnotherPage.aspx传回内容



的Response.Redirect [35] [36] [37] [38]


优点: -
RESTful - 它更改地址栏,该地址可用于记录请求之间的状态更改。


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


Server.Transfer的


优点: -
快。


缺点: -
状态丢失 - 如果您正在使用Server.Transfer来更改应用程序的状态以响应回发,如果页面被重新加载,则该状态将丢失,因为地址栏将与第一个时相同请求。

其它参考17


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


Server.Transfer的
Server.Transfer()不会更改地址栏,我们无法回击。当他/她不希望用户看到他要去的地方时,应该使用Server.Transfer()。有时在加载类型页面上。
它将当前页面请求传输到同一服务器上的另一个.aspx页面。
它保留了服务器资源并避免了对服务器的不必要的往返。
它保留了Query String和Form Variables(可选)。
它不显示在用户Web浏览器中重定向请求的真实URL。
Server.Transfer在浏览器不知道任何事情的情况下发生,浏览器请求页面,但服务器返回另一个页面的内容。