Server.Transfer 对比响应.重定向
Posted
技术标签:
【中文标题】Server.Transfer 对比响应.重定向【英文标题】:Server.Transfer Vs. Response.Redirect 【发布时间】:2010-09-18 11:35:10 【问题描述】:Server.Transfer
和 Response.Redirect
有什么区别?
【问题讨论】:
优点和缺点已在以下网站中说明。 developer.com/net/asp/article.php/3299641 文章中一个有趣的观点是,Server.Transfer 比 Server.Redirect 消耗更多的服务器功率。 Server.Transfer 减少了页面请求,所以我认为它在这方面“更好”。但是,Response.Redirect 可以将用户发送到外部站点,而 Server.Transfer 则不能。 如果您在 IIS 7 集成模式下运行,您可以考虑使用Server.TransferRequest
而不是 Server.Transfer
。
@Haacked 一开始就应该读到,Server.TransferRequest 解决了我的问题 iwth web matrix 和 iis7。格拉西亚斯。他们应该把它放在这里。
【参考方案1】:
Response.Redirect
只是向浏览器发送一条消息(HTTP 302)。
Server.Transfer
在浏览器一无所知的情况下发生,浏览器请求一个页面,但服务器返回另一个页面的内容。
【讨论】:
这是否适用于带有 Web 矩阵的 CShtml 页面?在执行 Server.Transfer 到 CSHTML 页面(例如 Server.Transfer("~/somepage.cshtml",true) 时,我似乎无法让它工作,但似乎适用于其他类型的页面。是的,我已经安装了剃须刀,并且页面按预期工作。 嘿发现了。您必须对 cshtml Web 矩阵页面使用 Server.TransferRequest。 Server.Transfer() 是否只传输到物理页面?例如。如果我转移到 Server.Transfer("default/category1.aspx") 那么是否需要一个默认文件夹和一个 category1,aspx 页面?【参考方案2】:Response.Redirect 成本更高,因为它增加了到服务器的额外行程以确定去哪里。
Server.Transfer 效率更高,但它可能会对用户产生一点误导,因为 Url 不会发生物理变化。
根据我的经验,性能差异不足以使用后一种方法
【讨论】:
【参考方案3】:传输完全是服务器端的。客户端地址栏保持不变。关于请求之间的上下文传输的一些复杂性。刷新和重新启动页面处理程序可能很昂贵,因此在管道的早期进行传输,例如在 BeginRequest 期间的 HttpModule 中。仔细阅读 MSDN 文档,测试和理解 HttpContext.Request 的新值——尤其是在 Postback 场景中。我们通常将 Server.Transfer 用于错误场景。
重定向以 302 状态和客户端往返响应终止请求,并在内部发生异常(较小的服务器性能命中 - 取决于您每天执行多少次)客户端然后导航到新地址。浏览器地址栏和历史更新等。客户支付额外往返的费用 - 费用因延迟而异。在我们的业务中,我们重定向很多我们编写了自己的模块以避免异常成本。
【讨论】:
【参考方案4】:Response.Redirect()
会将您带到一个新页面,更新地址栏并将其添加到浏览器历史记录中。在您的浏览器上,您可以点击返回。
Server.Transfer()
不会更改地址栏。你不能反击。
当我不希望用户看到我要去哪里时,我使用Server.Transfer()
。有时在“加载”类型的页面上。
否则我会一直使用Response.Redirect()
。
【讨论】:
【参考方案5】:Response.Redirect 将页面重定向到另一个页面在第一页到达客户端之后。所以客户端知道重定向。
Server.Transfer 退出页面的当前执行。客户端不知道重定向。它允许您传输查询字符串和表单变量。
所以这取决于你的需要选择哪个更好。
【讨论】:
我调用了Response.Redirect
,恶意用户能否绕过Response.Redirect
来加载原始页面?
@northben - 在技术方面说“不”从来都不是一件容易的事,因为几乎任何事情都可能受到损害 - 但在这种情况下,他们怎么可能 - 我会说不,他们不能......但是我在生活中多次被证明是错误的。【参考方案6】:
Server.Transfer 不会更改客户端浏览器中的 URL,因此实际上浏览器不知道您已更改为另一个服务器端处理程序。 Response.Redirect 告诉浏览器移动到不同的页面,因此标题栏中的 url 会发生变化。
Server.Transfer 稍微快一些,因为它避免了到服务器的往返,但不更改 url 对您来说可能是好是坏,这取决于您要执行的操作。
【讨论】:
【参考方案7】:除了 ScarletGarden 的评论,您还需要考虑搜索引擎和您的重定向的影响。此页面是否已永久移动?暂时地?它有所作为。
见:Response.Redirect vs. "301 Moved Permanently":
我们都使用过 Response.Redirect 一次或一次。这是快 以及让访客指出的简单方法 如果他们以某种方式朝着正确的方向前进 最终在错误的地方。但是你有没有 知道 Response.Redirect 发送一个 HTTP响应状态码“302 发现”当你真的想 发送“301 永久移动”?
区别似乎很小,但在 在某些情况下,它实际上可以使 很大的区别。例如,如果您 使用“301 永久移动”响应 代码,大多数搜索引擎都会删除 他们索引中的过时链接和 用新的替换它。如果你 使用“302 Found”,他们会继续 返回旧页面...
【讨论】:
链接失效。请改用此web.archive.org link。【参考方案8】:简而言之:Response.Redirect
只是告诉浏览器访问另一个页面。 Server.Transfer
有助于减少服务器请求,保持 URL 不变,并通过一些 bug 抨击,允许您传输查询字符串和表单变量。
我发现并同意的事情 (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")
.
【讨论】:
+1 表示评论,但这似乎是从developer.com/net/asp/article.php/3299641 逐字复制的。如果它来自其他来源,您应该至少引用它。 ...但他们复制了它,他们应该引用你。 我说:我发现并同意的东西; 应该链接到来源并为复制的部分使用报价格式/突出显示。 怎么maintaining the original URL... ...really help streamline data entry techniques
?【参考方案9】:
Response.Redirect()
应在以下情况下使用:
Server.Transfer()
应在以下情况下使用:
【讨论】:
更清楚,对我来说,这是一个可以接受的答案。【参考方案10】:Response.Redirect: 告诉浏览器可以在新位置找到所请求的页面。然后浏览器向新页面发起另一个请求,将其内容加载到浏览器中。这导致浏览器发出两个请求。
Server.Transfer:它将执行从第一页转移到服务器上的第二页。就浏览器客户端而言,它发出一个请求,初始页面是响应内容的页面。 这种方法的好处是减少了从客户端浏览器到服务器的往返次数。此外,任何已发布的表单变量和查询字符串参数也可用于第二页。
【讨论】:
【参考方案11】:Server.Transfer 的美妙之处在于您可以用它做些什么:
TextBox myTxt = (TextBox)this.Page.PreviousPage.FindControl("TextBoxID");
只要你使用Server.Transfer而不是Response.Redirect,你就可以使用上述方法从上一页获取任何东西
【讨论】:
【参考方案12】:如上所述,有许多不同之处。除此之外,还有一个不同之处。 Response.Redirect()
可用于将用户重定向到不属于应用程序的任何页面,但Server.Transfer()
只能用于将用户重定向到应用程序内。
//This will work.
Response.Redirect("http://www.google.com");
//This will not work.
Server.Transfer("http://www.google.com");
【讨论】:
【参考方案13】:只是关于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(),它运行的是给定路径的 handler,参见
ASP.NET 不会验证当前用户是否有权查看由 Execute 方法传递的资源。虽然 ASP.NET 授权和身份验证逻辑在调用原始资源处理程序之前运行,但 ASP.NET 直接调用 Execute 方法指示的处理程序,并且不会为新资源重新运行身份验证和授权逻辑。如果您的应用程序的安全策略要求客户端具有适当的授权才能访问资源,则应用程序应强制重新授权或提供自定义访问控制机制。
您可以使用 Redirect 方法而不是 Execute 方法强制重新授权。 重定向 执行浏览器请求新资源的客户端重定向。因为这个重定向是一个新的请求进入系统,所以它受制于 Internet 信息服务 (IIS) 和 ASP.NET 安全策略的所有身份验证和授权逻辑。
-from MSDN
【讨论】:
【参考方案14】:Response.Redirect 涉及额外的往返并更新地址栏。
Server.Transfer 不会导致地址栏发生变化,服务器用另一个页面的内容响应请求
例如
Response.Redirect:-
-
在客户端,浏览器请求页面http://InitiallyRequestedPage.aspx
在服务器上以 302 响应请求并传递重定向地址 http://AnotherPage.aspx。
在客户端,浏览器向地址http://AnotherPage.aspx 发出第二个请求。
在服务器上响应来自http://AnotherPage.aspx 的内容
Server.Transfer:-
-
在客户端浏览器请求页面http://InitiallyRequestedPage.aspx
在服务器服务器上。转移到http://AnotherPage.aspx
在服务器上对http://InitiallyRequestedPage.aspx 的请求做出响应,从http://AnotherPage.aspx 传回内容
Response.Redirect
优点:- RESTful - 它更改地址栏,地址可用于记录请求之间的状态更改。
缺点:- 慢 - 客户端和服务器之间有一个额外的往返。当客户端和服务器之间存在大量延迟时,这可能会很昂贵。
Server.Transfer
优点:- 快。
缺点:- 状态丢失 - 如果您使用 Server.Transfer 更改应用程序的状态以响应回发,如果页面随后重新加载,该状态将丢失,因为地址栏将与第一个相同请求。
【讨论】:
【参考方案15】:“response.redirect”和“server.transfer”有助于在页面执行时将用户从一个页面转移到另一个页面。但是他们进行这种转移/重定向的方式非常不同。
如果您是视觉专家并且希望看到演示而不是理论,我建议您观看下面的 facebook 视频,它以更直观的方式解释了差异。
https://www.facebook.com/photo.php?v=762186150488997
他们之间的主要区别在于谁进行了转移。在“response.redirect”中,传输由浏览器完成,而在“server.transfer”中,由服务器完成。让我们试着更详细地理解这个陈述。
在“Server.Transfer”中,以下是传输发生的顺序:-
1.用户向 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”由服务器执行,而“Response.Redirect”由浏览器执行。 “Response.Redirect”需要两个请求来做页面的重定向。
那么什么时候使用“Server.Transfer”,什么时候使用“Response.Redirect”呢?
当您想要浏览位于同一服务器上的页面时使用“Server.Transfer”,当您想要在不同服务器和域上的页面之间浏览时使用“Response.Redirect”。
下面是一个汇总表,其中列出了差异以及在哪种情况下使用。
【讨论】:
在使用 Server.Transfer 和 Response.Redirect 出现问题时很有用 ***.com/questions/1433448/thread-was-being-aborted 对于Server.Transfer
:同一服务器或同一IIS网站 ?
您能否更新以下段落,因为我的编辑至少需要 6 个字符:换句话说,“Server.Transfer”由服务器执行,而“Response.Redirect”由 thr 浏览器。 “Response.Redirect”需要两个请求来重定向页面。【参考方案16】:
Response.Redirect Response.Redirect() 会将您发送到一个新页面,更新地址栏并将其添加到浏览器历史记录中。在您的浏览器上,您可以单击返回。 它将请求重定向到我们服务器上的一些纯 HTML 页面或其他一些 Web 服务器。 它会在每个请求上导致到服务器的额外往返。 它不保留原始请求中的查询字符串和表单变量。 它可以在浏览器中看到新的重定向 URL(并且可以在必要时为其添加书签)。 回复。重定向只是将消息向下发送到 (HTTP 302) 浏览器。
Server.Transfer Server.Transfer() 不会改变地址栏,我们无法反击。当他/她不想让用户看到他要去哪里时,应该使用 Server.Transfer()。有时在“加载”类型的页面上。 它将当前页面请求传输到同一服务器上的另一个 .aspx 页面。 它保留了服务器资源并避免了不必要的服务器往返。 它保留查询字符串和表单变量(可选)。 它不会显示在用户 Web 浏览器中重定向请求的真实 URL。 Server.Transfer 在浏览器不知道的情况下发生,浏览器请求一个页面,但服务器返回另一个页面的内容。
【讨论】:
以上是关于Server.Transfer 对比响应.重定向的主要内容,如果未能解决你的问题,请参考以下文章
HttpServletResponse ServletResponse 返回响应 设置响应头设置响应正文体 重定向 常用方法 如何重定向 响应编码 响应乱码