Server.Transfer
和之间有什么区别Response.Redirect
?
每个的优点和缺点是什么?
什么时候适合另一个?
什么时候不适合?
CMS.. 227
Response.Redirect
只需将消息(HTTP 302)发送到浏览器即可.
Server.Transfer
在浏览器不知道任何事情的情况下发生,浏览器请求页面,但服务器返回另一个页面的内容.
Response.Redirect
只需将消息(HTTP 302)发送到浏览器即可.
Server.Transfer
在浏览器不知道任何事情的情况下发生,浏览器请求页面,但服务器返回另一个页面的内容.
Response.Redirect()
将发送到新页面,更新地址栏并将其添加到浏览器历史记录中.在浏览器上,您可以单击返回.
Server.Transfer()
不会更改地址栏.你不能回击.
我用Server.Transfer()
的时候,我不希望用户看到我要去的地方.有时在"加载"类型的页面上.
否则我会一直使用Response.Redirect()
.
要简短: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具有名为TextBox1的TextBox控件,并且您将preserveForm参数设置为True,则转移到WebForm2.aspx,您将能够通过引用检索原始页面TextBox控件的值
Request.Form("TextBox1")
.
Response.Redirect()
应该在以下时间使用:
我们希望将请求重定向到我们服务器上的某些纯HTML页面或其他某个Web服务器
我们不关心在每个请求上导致额外的往返服务器
我们不需要保留原始请求中的查询字符串和表单变量
我们希望我们的用户能够看到他在浏览器中重定向的新重定向URL(如果必要,可以将其加入书签)
Server.Transfer()
应该在以下时间使用:
我们希望将当前页面请求转移到同一服务器上的另一个.aspx页面
我们希望保留服务器资源并避免不必要的往返服务器
我们想保留查询字符串和表单变量(可选)
我们不需要在用户Web浏览器中显示我们重定向请求的真实URL
在第一页到达客户端后, Response.Redirect将页面重定向到另一页面.所以客户端知道重定向.
Server.Transfer退出当前页面执行.客户端不知道重定向.它允许您传输查询字符串和表单变量.
所以这取决于你需要选择哪个更好.
"response.redirect"和"server.transfer"有助于在页面执行时将用户从一个页面转移到另一个页面.但他们进行此转移/重定向的方式却截然不同.
如果你是视觉家伙,并希望看到演示而不是理论,我建议看到下面的facebook视频,以更具说明性的方式解释差异.
https://www.facebook.com/photo.php?v=762186150488997
它们之间的主要区别在于转移谁.在"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".
下面是一个汇总表,其中列出了差异以及使用的场景.
Server.Transfer的美妙之处在于它可以用它做什么:
TextBox myTxt = (TextBox)this.Page.PreviousPage.FindControl("TextBoxID");
只要您使用Server.Transfer但不使用Response.Redirect,您可以使用上述方法从上一页获取任何内容
除了ScarletGarden的评论之外,您还需要考虑搜索引擎和重定向的影响.此页面是永久移动的吗?暂时?它有所作为.
请参阅:Response.Redirect与"301永久移动":
我们都曾经使用过Response.Redirect.如果访问者以某种方式最终落入错误的位置,这将是让访问者指向正确方向的快捷方式.但是你知道当你真的想要发送"301 Moved Permanently"时,Response.Redirect会发送一个HTTP响应状态代码"302 Found"吗?
区别似乎很小,但在某些情况下,它实际上可以产生很大的不同.例如,如果您使用"301 Moved Permanently"响应代码,大多数搜索引擎将从索引中删除过时的链接并将其替换为新的链接.如果您使用"302 Found",他们将继续返回旧页面...
转移完全是服务器端的.客户端地址栏保持不变.关于请求之间的上下文传输的一些复杂性.刷新和重新启动页面处理程序可能很昂贵,因此您需要在管道中尽早进行传输,例如在BeginRequest期间在HttpModule中进行传输.仔细阅读MSDN文档,测试并理解HttpContext.Request的新值 - 尤其是在Postback场景中.我们通常使用Server.Transfer来处理错误情况.
重定向使用302状态和客户端往返响应终止请求,并在内部执行异常(次要服务器性能命中 - 取决于您每天执行的次数)客户端随后导航到新地址.浏览器地址栏和历史记录更新等.客户支付额外往返的费用 - 费用因延迟而异.在我们的业务中,我们重定向很多,我们编写了自己的模块,以避免异常成本.
Response.Redirect成本更高,因为它增加了额外的服务器之旅,以确定去哪里.
Server.Transfer效率更高,但由于Url没有实际更改,因此可能会对用户造成一些误导.
根据我的经验,性能上的差异并不足以使用后一种方法
如上所述,有许多差异。最重要的是,还有另外一个区别。Response.Redirect()
可以用于将用户重定向到不属于应用程序的任何页面,而Server.Transfer()
只能用于将用户重定向到应用程序内。
//This will work. Response.Redirect("http://www.google.com"); //This will not work. Server.Transfer("http://www.google.com");