Server.Transfer Vs.的Response.Redirect

时间:2008-10-22 05:34:46

标签: asp.net redirect server.transfer

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

  • 每个的优点和缺点是什么?
  • 什么时候适合另一个?
  • 什么时候不适合?

16 个答案:

答案 0 :(得分:224)

Response.Redirect只是向浏览器发送消息(HTTP 302)

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

答案 1 :(得分:90)

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

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

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

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

答案 2 :(得分:73)

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

我发现并同意的事情(source):

  

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 :(得分:30)

在以下情况下应使用

Response.Redirect()

  • 我们希望将请求重定向到我们服务器上的某些纯HTML页面或其他一些Web服务器
  • 我们不关心在每次请求时导致额外的往返服务器
  • 我们不需要保留原始请求中的查询字符串和表单变量
  • 我们希望我们的用户能够在浏览器中看到重定向的新重定向网址(如果需要,可以将其加入书签)
在以下情况下应使用

Server.Transfer()

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

答案 4 :(得分:28)

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

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

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

答案 5 :(得分:21)

enter image description here

" Response.Redirect的"和" server.transfer"在页面执行时帮助将用户从一个页面转移到另一个页面。但他们进行此转移/重定向的方式却截然不同。

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

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

他们之间的主要区别在于谁进行了转移。在" response.redirect"在" server.transfer"中,浏览器完成传输。它是由服务器完成的。让我们试着更详细地理解这个陈述。

In" Server.Transfer"以下是转移发生的顺序: -

1.User向ASP.NET页面发送请求。在下图中,请求被发送到" WebForm1"我们想要导航到#34; Webform2"。

2.Server开始执行" Webform1"并开始页面的生命周期。但是在页面的完整生命周期完成之前,“Server.transfer”恰好发生在WebForm2"上。

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

enter image description here

在" Response.Redirect"以下是导航事件的顺序: -

1.Client(浏览器)向页面发送请求。在下图中,请求被发送到" WebForm1"我们想要导航到#34; Webform2"。

2.生活周期" Webform1"开始执行。但是在生命周期和#34; Response.Redirect"之间发生的情况。

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

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

enter image description here

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

所以何时使用" Server.Transfer"何时使用" Response.Redirect"吗

使用" Server.Transfer"当您想要导航位于同一服务器上的页面时,请使用" Response.Redirect"当您想要在位于不同服务器和域的页面之间导航时。

enter image description here

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

enter image description here

答案 6 :(得分:11)

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

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

只要您使用Server.Transfer但不使用Response.Redirect

,您可以使用上述方法从上一页获取任何内容

答案 7 :(得分:10)

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

请参阅:Response.Redirect vs. "301 Moved Permanently"

  

我们都使用了Response.Redirect   一次或另一次。这很快   以及让游客指出的简单方法   如果他们以某种方式在正确的方向   最终走错了地方。但是你呢?   知道Response.Redirect发送了一个   HTTP响应状态代码“302   找到“当你真的想要的时候   发送“301永久移动”?

     

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

答案 8 :(得分:6)

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

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

答案 9 :(得分:5)

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

Server.Transfer效率更高,但由于Url没有实际更改,因此可能会对用户造成一些误导。

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

答案 10 :(得分:5)

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

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

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

答案 11 :(得分:4)

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

Server.Transfer稍快一些,因为它避免了到服务器的一次往返,但是不更改url可能对你有好处或坏处,具体取决于你想要做什么。

答案 12 :(得分:4)

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

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

答案 13 :(得分:3)

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

     

- from MSDN

答案 14 :(得分:1)

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

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

e.g。

<强>的Response.Redirect: -

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

    <强> Server.Transfer的: -

    1. 在客户端浏览器上请求页面http://InitiallyRequestedPage.aspx
    2. 在服务器Server.Transfer to http://AnotherPage.aspx
    3. 在服务器上,响应http://InitiallyRequestedPage.aspxhttp://AnotherPage.aspx传回内容的请求
    4. <强>的Response.Redirect

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

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

      <强> Server.Transfer的

      优点: - 快。

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

答案 15 :(得分:0)

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

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