Server.Transfer VS. 的Response.Redirect

Server.TransferResponse.Redirect什么区别?

  • 各有什么优缺点?
  • 什么时候适合于另一个?
  • 什么时候不合适?

Response.Redirect仅向浏览器发送消息(HTTP 302) 。

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

Response.Redirect()会将您发送到新页面,更新地址栏并将其添加到浏览器历史logging中。 在您的浏览器上,您可以点击返回。

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

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

否则,我会一直使用Response.Redirect()

简短: Response.Redirect只是告诉浏览器访问另一个页面。 Server.Transfer有助于减less服务器请求,使URL保持不变,并且通过一些小小的bug,可以传输查询string和表单variables。

我发现并同意的东西( 来源 ):

Server.Transfer是类似的,它发送用户到另一个页面,如Server.Transfer("WebForm2.aspx")的语句。 但是,这种说法有许多明显的优点和缺点。

首先,使用Server.Transfer转移到另一个页面节省服务器资源。 而不是告诉浏览器redirect,它只是改变Web服务器上的“焦点”并传输请求。 这意味着你不会收到很多的HTTP请求,这就减轻了你的Web服务器的压力,使你的应用程序运行得更快。

但要小心:因为“传输”进程只能在服务器上运行的站点上运行; 您不能使用Server.Transfer将用户发送到外部站点。 只有Response.Redirect可以做到这一点。

其次, Server.Transfer在浏览器中保留原始URL。 这实际上可以帮助简化数据input技术,尽pipe在debugging时可能会造成混乱。

这不是全部: Server.Transfer方法也有第二个参数 – “preserveForm”。 如果将此设置为True ,则使用诸如Server.Transfer("WebForm2.aspx", True)之类的语句,现有的查询string和任何表单variables仍然可用于要传输到的页面。

例如,如果WebForm1.aspx具有名为TextBox1的TextBox控件,并且您将preserveForm参数设置为True,您将其传输到WebForm2.aspx,则可以通过引用Request.Form("TextBox1")来检索原始页面TextBox控件的值Request.Form("TextBox1")

Response.Redirect 第一页到达客户端后将页面redirect到另一个页面。 所以客户端知道redirect。

Server.Transfer退出当前的页面执行。 客户端不知道redirect。 它允许你传输查询string和表单variables。

所以这取决于你的需要select哪个更好。

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

  • 我们希望将请求redirect到我们的服务器上的一些纯HTML页面或其他Web服务器
  • 我们不关心在每个请求上引起额外的往返服务器
  • 我们不需要保留来自原始请求的Query String和Form Variables
  • 我们希望我们的用户能够看到他在浏览器中redirect的新redirectURL(如果有必要,可以将其join书签)

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

  • 我们希望将当前页面请求转移到同一台服务器上的另一个.aspx页面
  • 我们希望保留服务器资源并避免不必要的往返服务器
  • 我们想要保留Query String和Form Variables(可选)
  • 我们不需要在用户Web浏览器中显示redirect请求的真实URL

在这里输入图像描述

“response.redirect”和“server.transfer”有助于在页面执行时将用户从一个页面转移到另一个页面。 但是他们做这种传输/redirect的方式是非常不同的。

如果你是视觉的人,并希望看到示威而不是理论,我会build议看到下面的Facebookvideo,以更多的示范方式解释的差异。

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

他们之间的主要区别是谁是转移。 在“response.redirect”中,传输由浏览器完成,而在“server.transfer”中则由服务器完成。 让我们试图更详细地了解这一说法。

在“Server.Transfer”中,以下是如何传输的顺序:

1.用户发送一个请求到一个ASP.NET页面。 在下图中,请求被发送到“WebForm1”,我们想导航到“Webform2”。

2.服务器开始执行“Webform1”并开始页面的生命周期。 但在页面的完整生命周期完成之前,“WebForm2”发生了“Server.transfer”。

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

在这里输入图像描述

在“Response.Redirect”中,以下是用于导航的事件序列:

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

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

现在,除了服务器做redirect之外,他还向浏览器发送HTTP 302命令。 这个命令告诉浏览器他必须发起GET请求到“Webform2.aspx”页面。

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

在这里输入图像描述

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

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

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

在这里输入图像描述

下面是一个总结表,其中指出了差异和在哪个情况下使用。

在这里输入图像描述

除了ScarletGarden的评论,你还需要考虑search引擎和你的redirect的影响。 此页面是否永久移动? 暂时? 它有所作为。

请参阅: Response.Redirect与“301永久移动” :

我们都曾经使用过Response.Redirect。 如果他们以某种方式出现在错误的地方,这是快速而简单的方法,让参观者指出正确的方向。 但是你是否知道,当你真的想发送“301永久移动”时,Response.Redirect发送一个HTTP响应状态码“302 Found”?

这个区别似乎很小,但是在某些情况下,它实际上可以造成很大的差别。 例如,如果您使用“301永久移动”响应代码,大多数search引擎将从其索引中删除过期的链接,并将其replace为新的链接。 如果您使用“302find”,他们将继续返回到旧页面…

Server.Transfer的优点是你可以用它做什么:

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

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

传输完全是服务器端的。 客户端地址栏保持不变。 请求之间的上下文传输有一些复杂性。 刷新和重新启动页面处理程序可能会很昂贵,所以请尽早在pipe道中进行传输,例如在BeginRequest期间在HttpModule中进行传输。 仔细阅读MSDN文档,testing并理解HttpContext.Request的新值 – 特别是在Postbackscheme中。 我们通常使用Server.Transfer来处理错误情况。

redirect用302状态和客户端往返响应来终止请求,并在内部吃一个exception(次要服务器的perf命中 – 取决于你每天做多less次)然后客户端导航到新的地址。 浏览器地址栏和历史logging更新等。客户支付额外的往返成本 – 成本因延迟而异。 在我们的业务中,我们重写了很多,我们编写了自己的模块,以避免例外成本。

Response.Redirect的成本更高,因为它增加了一个额外的旅程服务器,以找出去哪里。

Server.Transfer更高效,但是由于Url在物理上并没有改变,所以它可能会对用户造成一些误导。

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

Server.Transfer不更改客户端浏览器中的URL,因此浏览器不知道您更改为另一个服务器端处理程序。 Response.Redirect通知浏览器移动到不同的页面,所以标题栏中的URL会发生变化。

Server.Transfer稍微快一点,因为它避免了一次到服务器的往返,但是根据你想要做的事情,url的不变也许对你有好处或者坏处。

Response.Redirect:告诉浏览器所请求的页面可以在新的位置find。 浏览器然后启动另一个请求到新的页面在浏览器中加载其内容。 这导致了浏览器的两个请求。

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

关于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(),它运行的是给定path的处理程序 ,请参阅

ASP.NET不validation当前用户是否有权查看由Execute方法传递的资源。 尽pipeASP.NET授权和身份validation逻辑在调用原始资源处理程序之前运行,但ASP.NET直接调用Execute方法指示的处理程序,并且不会重新运行新资源的身份validation和授权逻辑。 如果您的应用程序的安全策略要求客户端有适当的权限来访问资源,应用程序应强制重新授权或提供自定义的访问控制机制。

您可以使用redirect方法而不是执行方法强制重新授权。 redirect执行客户端redirect,浏览器请求新的资源。 由于此redirect是进入系统的新请求,因此它将受到Internet信息服务(IIS)和ASP.NET安全策略的所有身份validation和授权逻辑的支配。

– 来自MSDN

如上所述有很多不同之处。 除此之外,还有一个区别。 可以使用Response.redirect()将用户redirect到不属于应用程序的任何页面,但server.transfer()只能用于在应用程序内redirect用户。

 Response.Redirect(''http://www.google.com"); //This will work. Server.Transfer(''http://www.google.com"); //This will not work. 
  1. 就像超链接和Response.Redirect一样,Server.Transfer用于导航到同一Web服务器上运行的其他页面/站点。
  2. Server.Transfer不能用于导航到不同Web服务器上的站点/页面。
  3. Server.Transfer不会更改地址栏中的URL
  4. Server.Transfer比Response.Redirect更快,因为redirect发生在一个请求/响应周期的服务器上。 Response.Redirect()涉及2个请求/响应周期。
  5. 与Server.Transfer从原始请求的表单variables被保留。

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

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

Response.Redirect包含额外的往返行程并更新地址栏。

Server.Transfer不会导致地址栏更改,服务器将响应来自另一个页面的内容的请求

例如

Response.Redirect的: –

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

Server.Transfer方法: –

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

的Response.Redirect

优点: – RESTful – 它改变地址栏,地址可以用来logging状态请求之间的变化。

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

Server.Transfer的

优点: –快速。

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

Response.Redirect Response.Redirect()会将您发送到新页面,更新地址栏并将其添加到浏览器历史logging中。 在您的浏览器上,您可以点击返回。 它将请求redirect到我们的服务器上的一些纯HTML页面或其他Web服务器。 它导致每个请求的服务器的额外往返。 它不保留来自原始请求的查询string和表单variables。 它可以在浏览器中查看重新定向的新redirectURL(如果有必要,可以将其标记为书签)。 响应。 redirect只是简单地向(HTTP 302)浏览器发送消息。

Server.Transfer Server.Transfer()不改变地址栏,我们不能反击。当他/她不希望用户看到他要去的地方时,应该使用Server.Transfer()。 有时在“加载”types页面上。 它将当前页面请求传输到同一台服务器上的另一个.aspx页面。 它保留服务器资源并避免不必要的往返服务器。 它保留查询string和表格variables(可选)。 它不显示在用户Web浏览器中redirect请求的真实URL。 Server.Transfer在浏览器不知道任何事情的情况下发生,浏览器请求一个页面,但服务器返回另一个页面的内容。