Server.Transfer和Response.Redirect之间的区别是什么?
Server.Transfer
Response.Redirect
Response.Redirect简单地向浏览器发送一个消息302 (HTTP)。
Server.Transfer发生在浏览器一无所知的情况下,浏览器请求一个页面,但服务器返回另一个页面的内容。
响应。重定向的代价更大,因为它向服务器添加了额外的行程,以确定要去哪里。
服务器。传输是更有效的,但它可能会误导用户,因为Url没有物理改变。
根据我的经验,性能上的差异还没有大到可以使用后一种方法
传输完全是服务器端的。客户端地址栏保持不变。请求之间上下文的传输有些复杂。刷新和重新启动页面处理程序可能是昂贵的,所以在管道的早期进行传输,例如在BeginRequest期间的HttpModule中。仔细阅读MSDN文档,并测试和理解HttpContext的新值。请求——特别是在回发场景中。我们通常使用服务器。转换为错误场景。
重定向以302状态终止请求,客户端往返响应并在内部吃掉一个异常(轻微的服务器性能打击-取决于你每天做多少)客户端然后导航到新地址。浏览器地址栏&历史更新等。客户端支付额外的往返费用-费用取决于延迟。在我们的业务中,我们重定向很多,我们编写自己的模块以避免异常成本。
Response.Redirect()将把你发送到一个新页面,更新地址栏并将其添加到浏览器历史记录中。在浏览器上,您可以单击返回。
Response.Redirect()
Server.Transfer()不会改变地址栏。你不能反击。
Server.Transfer()
当我不想让用户看到我要去哪里时,我使用Server.Transfer()。有时在“加载”类型的页面上。
否则,我将始终使用Response.Redirect()。
响应。重定向将页面重定向到另一个页面后第一页到达客户端。所以客户端知道重定向。
服务器。传输退出页面的当前执行。客户端不知道重定向。它允许您传输查询字符串和表单变量。
所以这取决于你的需要来选择哪个更好。
服务器。传输不会改变客户端浏览器中的URL,因此实际上浏览器并不知道您更改了另一个服务器端处理程序。响应。重定向告诉浏览器移动到另一个页面,因此标题栏中的url会发生变化。
服务器。传输稍微快一点,因为它避免了到服务器的一次往返,但不更改url可能对您有好处,也可能有坏处,这取决于您想要做什么。
除了ScarletGarden的评论,你还需要考虑搜索引擎和你的重定向的影响。这个页面永久移动了吗?暂时的?这很重要。
看到:响应。重定向vs。“301永久移动”:
我们都使用响应。在重定向 总有那么一次。这是快速的 也很容易让访客有针对性 在正确的方向上 在错误的地方结束。但是你呢 知道答案。重定向发送 HTTP响应状态代码“302” 当你真的想要的时候 发送“301永久移动”?< / p > 区别似乎很小,但在 在某些情况下,它实际上可以 很大的差别。例如,如果你 使用“301永久移动”响应 代码,大多数搜索引擎都会删除 索引和中的过期链接 把它换成新的。如果你 使用“302 Found”,他们会继续 .返回到旧页面
我们都使用响应。在重定向 总有那么一次。这是快速的 也很容易让访客有针对性 在正确的方向上 在错误的地方结束。但是你呢 知道答案。重定向发送 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 >
Server.Transfer与此类似,它将用户发送到另一个页面 使用Server.Transfer("WebForm2.aspx")之类的语句。然而, 这句话有许多明显的优点和缺点 首先,使用Server.Transfer转移到另一个页面 节约服务器资源。而不是告诉浏览器 重定向,它只是改变“焦点”在Web服务器和 传输请求。这意味着你不会得到那么多的HTTP 请求通过,从而减轻你的压力
Server.Transfer("WebForm2.aspx")
True
Server.Transfer("WebForm2.aspx", True)
例如,如果您的WebForm1。aspx有一个TextBox控件叫做 TextBox1和你转移到WebForm2。aspx与preserveForm 参数设置为True时,您将能够检索 原始页面文本框控件的引用 Request.Form("TextBox1") . < / p >
Request.Form("TextBox1")
Response.Redirect()应该在以下情况下使用:
Server.Transfer()应该在以下情况下使用:
响应。重定向:告诉浏览器可以在新的位置找到所请求的页面。然后,浏览器向新页面发起另一个请求,在浏览器中加载其内容。这将导致浏览器产生两个请求。
服务器。传输:它将执行从服务器上的第一页转移到第二页。就浏览器客户端而言,它只发出一个请求,初始页面就是响应内容的页面。 这种方法的好处是减少了一次从客户机浏览器到服务器的往返。此外,任何提交的表单变量和查询字符串参数也可用于第二个页面。< / 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
ASP。NET不会验证当前用户是否被授权查看执行方法交付的资源。尽管ASP。NET授权和身份验证逻辑在调用原始资源处理程序之前运行。NET直接调用执行方法所指示的处理程序,并且不为新资源重新运行身份验证和授权逻辑。如果应用程序的安全策略要求客户端具有适当的授权才能访问资源,则应用程序应该强制重新授权或提供自定义访问控制机制。
可以通过使用重定向方法而不是执行方法强制重新授权。重定向执行客户端重定向,浏览器在其中请求新资源。由于此重定向是进入系统的新请求,因此它服从Internet信息服务(IIS)和ASP的所有身份验证和授权逻辑。NET安全策略。
-从MSDN
响应。重定向涉及一个额外的往返和更新地址栏。
服务器。传输不会导致地址栏更改,服务器会用来自另一个页面的内容响应请求
如。
响应。重定向:
服务器。转让:
响应。重定向
< em >优点:- RESTful -它改变地址栏,地址可以用来记录请求之间的状态变化。< / p >
< em >缺点:- 慢——在客户端和服务器之间有一个额外的往返。当客户端和服务器之间有很大的延迟时,这可能会很昂贵
服务器。转移
< em >优点:- 快。< / p > < p > 缺点: - 状态丢失-如果您正在使用服务器。传输以改变应用程序的状态以响应回发,如果页面被重新加载,该状态将丢失,因为地址栏将与第一次请求时相同
”反应。重定向"和"服务器。“转移”有助于在页面执行时将用户从一个页面转移到另一个页面。但是他们进行这种转移/重定向的方式非常不同。
如果你是视觉爱好者,想看演示而不是理论,我建议你看看下面的facebook视频,它以更直观的方式解释了差异。
https://www.facebook.com/photo.php?v=762186150488997
他们之间的主要区别是谁来转账。在“响应。重定向“传输是由浏览器在服务器中完成的”。“传输”是由服务器完成的。让我们试着以更详细的方式来理解这句话。
在“服务器。转让”以下是转让发生的顺序:-
1.用户向ASP发送请求。网络页面。在下图中,请求被发送到“WebForm1”,我们希望导航到“Webform2”。
2.服务器开始执行“Webform1”,页面的生命周期开始。但是在页面的整个生命周期完成之前。transfer”恰好是“WebForm2”。
3.创建“Webform2”页面对象,执行整个页面生命周期,然后将输出HTML响应发送到浏览器。
在“回应”中。“重定向”下面是导航事件的顺序:-
1.客户端(浏览器)向页面发送请求。在下图中,请求被发送到“WebForm1”,我们希望导航到“Webform2”。
2.“Webform1”的生命周期开始执行。但在生命周期之间。重定向”发生。
3.现在,他向浏览器发送HTTP 302命令,而不是服务器执行重定向。该命令告诉浏览器必须向“Webform2”发起GET请求。aspx页面”。
4.浏览器解释302命令并为“Webform2.aspx”发送一个GET请求。
换句话说就是“服务器”。服务器在响应时执行“传输”。“重定向”由浏览器执行。”反应。重定向”需要两个请求来做页面的重定向。
所以什么时候使用“服务器”。转移”以及何时使用“响应”。重定向”?
使用“服务器。当您想导航位于同一服务器上的页面时,请使用“响应”。重定向"当你想在不同服务器和域上的页面之间导航时。
下面是一个汇总表,其中列出了不同之处以及在哪个场景中使用。
< >强反应。重定向 Response.Redirect()会将您发送到一个新页面,更新地址栏并将其添加到浏览器历史记录中。在浏览器上,您可以单击返回。 它将请求重定向到我们服务器上的一些普通HTML页面或其他web服务器。 它会在每个请求上导致到服务器的额外往返。 它不保留原始请求中的查询字符串和表单变量。 它可以在浏览器中看到新的重定向URL(如果有必要,还可以将其收藏起来)。 响应。重定向只是将消息发送到(HTTP 302)浏览器
< >强服务器。转移 Server.Transfer()不会改变地址栏,我们不能进行反击。当他/她不想让用户看到他要去哪里时,应该使用Server.Transfer()。有时在“加载”类型页面上。 它将当前页面请求传输到同一服务器上的另一个.aspx页面。 它保留了服务器资源并避免了到服务器的不必要的往返。 它保留查询字符串和表单变量(可选)。 它不会显示在用户Web浏览器中重定向请求的真实URL。 服务器。传输在浏览器不知情的情况下发生,浏览器请求一个页面,但服务器返回另一个页面的内容