Server.Transfer与 响应重定向


263

Server.Transfer和之间有什么区别Response.Redirect

  • 每种都有哪些优缺点?
  • 什么时候比另一个合适?
  • 什么时候不合适?

3
优点和缺点已在下面的站点中阐明。developer.com/net/asp/article.php/3299641文章中有趣的一点是,与Server.Redirect相比,Server.Transfer消耗更多的服务器功能。
Ray Lu

Server.Transfer减少了页面请求,因此我认为它在这方面“更好”。但是,Response.Redirect可以将用户发送到外部站点,而Server.Transfer则不能。
codeConcussion

1
如果您在IIS 7集成模式下运行,则可以考虑使用Server.TransferRequest而不是Server.Transfer
10年

@Haacked应该从一开始就读到,Server.TransferRequest通过Web矩阵和iis7解决了我的问题。格拉西亚斯。他们应该把它放在这里。
杰森·塞布林

Answers:


234

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

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


这对带有网络矩阵的CSHTML页面有效吗?在执行Server.Transfer到CSHTML页面(例如Server.Transfer(“〜/ somepage.cshtml”,true))时,我似乎无法使其正常工作,但似乎可用于其他类型的页面。是的,我已经安装了剃须刀,否则页面可以正常工作。
杰森·塞布林2012年

11
嘿发现了。您必须对cshtml Web矩阵页面使用Server.TransferRequest。
杰森·塞布林

Server.Transfer()仅传输到物理页面?例如 如果我传输到Server.Transfer(“ default / category1.aspx”),那么它是否需要一个默认文件夹和一个category1,aspx页面?
ihimv 2015年

95

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

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

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

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


75

简而言之: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控件,并且您将其saveForm参数设置为True转移到WebForm2.aspx,则可以通过引用检索原始页面TextBox控件的值 Request.Form("TextBox1")


10
+1以发表评论,但这似乎是从developer.com/net/asp/article.php/3299641逐字复制的。如果来自其他来源,则应至少引用它。
Johnno Nolan

...但是他们已经复制了它,应该引用您。
Johnno Nolan

7
我说:我发现并同意的东西;
TStamper

6
应该链接到源,并对复制的部分使用报价格式/突出显示。
克里斯·瑞

1
怎么可以maintaining the original URL... ...really help streamline data entry techniques
JohnB 2010年

36

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

  • 我们希望将请求重定向到服务器上的一些纯HTML页面或其他Web服务器
  • 我们不在乎每次请求都会导致服务器往返
  • 我们不需要保留原始请求中的查询字符串和表单变量
  • 我们希望我们的用户能够在浏览器中重定向到新的重定向URL(并在必要时将其添加为书签)

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

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

2
更清楚的是,对我来说,这是一个更好的答案。
Baljeetsingh

28

第一页到达客户端后, Response.Redirect将页面重定向到另一个页面。因此客户端知道重定向。

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

因此,选择哪种更好取决于您的需求。


1
Response.Redirect即使我打电话,恶意用户也可以绕过以加载原始页面Response.Redirect吗?
诺森本

@northben-在技术上说“不”绝非易事,因为几乎任何东西都可以妥协-但是在这种情况下,他们怎么可能-我会说他们不能……但是我已经被证明多次错误在生活中。
JonH

23

在此处输入图片说明

执行页面时,“ 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.服务器开始执行“ Webform1”,页面的生命周期开始。但是在页面的整个生命周期完成之前,“ WebForm2”发生了“ Server.transfer”。

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

在此处输入图片说明

在“ Response.Redirect”中,以下是导航事件的顺序:-

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

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

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

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

在此处输入图片说明

换句话说,“ Server.Transfer”由服务器执行,而“ Response.Redirect”由浏览器执行。“ Response.Redirect”需要对两个请求进行页面重定向。

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

当您要浏览位于同一服务器上的页面时,请使用“ Server.Transfer”;当您要在位于不同服务器和域上的页面之间进行导航时,请使用“ Response.Redirect”。

在此处输入图片说明

以下是汇总表,其中列出了差异以及使用哪种方案。

在此处输入图片说明



对于Server.Transfer同一台服务器还是同一台IIS网站
Kiquenet '16

能否请您更新,因为我的编辑至少需要6个字符以下段落:换句话说“Server.Transfer的”由服务器同时“的Response.Redirect”由执行执行THR浏览器。“ Response.Redirect” 需要对两个请求进行页面重定向。
保罗

11

Server.Transfer的美丽之处在于您可以使用它:

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

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


10

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

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

我们都曾经使用过Response.Redirect。如果访客以某种方式落在错误的地方,这是使访客指向正确方向的快速简便的方法。但是,当您可能真的想发送“ 301已永久移动”时,您是否知道Response.Redirect发送HTTP响应状态代码“ 302 Found”?

区别似乎很小,但在某些情况下,实际上可以有很大的不同。例如,如果您使用“ 301永久移动”响应代码,则大多数搜索引擎将从其索引中删除过时的链接,并将其替换为新的链接。如果您使用“找到的302”,他们将继续返回旧页面...


链接无效。请改用此web.archive.org链接
造口

6

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

重定向以302状态终止请求,并且客户端往返响应带有内部错误(内部服务器性能下降-取决于您每天执行多少次操作),然后客户端导航到新地址。浏览器地址栏和历史记录更新等。客户端支付额外的往返费用-费用随延迟而变化。在我们的业务中,我们重定向了很多东西,我们编写了自己的模块,以避免出现异常费用。


6

如上所述,有许多差异。最重要的是,还有另外一个区别。Response.Redirect()可以用于将用户重定向到不属于应用程序的任何页面,而Server.Transfer()只能用于将用户重定向到应用程序内。

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

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

5

Response.Redirect的成本更高,因为它增加了到服务器的额外行程,以找出要去的地方。

Server.Transfer效率更高,但是由于Url不会发生物理变化,因此可能会误导用户。

以我的经验,性能差异还不足以使用后一种方法


4

Server.Transfer不会在客户端浏览器中更改URL,因此实际上浏览器不知道您已更改为另一个服务器端处理程序。Response.Redirect告诉浏览器移至另一个页面,因此标题栏中的URL会更改。

Server.Transfer稍快一些,因为它避免了到服务器的一次往返,但是不更改url对您来说可能是好事,也可能是坏事,这取决于您要执行的操作。


4

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

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


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安全策略的所有身份验证和授权逻辑。

- 来自MSDN


2

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

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

例如

响应重定向:-

  1. 在客户端上,浏览器请求页面http://InitiallyRequestedPage.aspx
  2. 在服务器上,响应302传递重定向地址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返回内容

响应重定向

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

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

服务器传输

优点:- 快速。

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


0

Response.Redirect Response.Redirect()会将您发送到新页面,更新地址栏并将其添加到浏览器历史记录中。在浏览器上,您可以单击返回。它将请求重定向到我们服务器上的一些普通HTML页面或其他Web服务器。它会在每次请求时导致与服务器的其他往返。它不会保留原始请求中的查询字符串和表单变量。它使您能够查看新的重定向URL,并在浏览器中将其重定向到该URL(并在必要时将其添加为书签)。响应。重定向只是将消息向下发送到(HTTP 302)浏览器。

Server.Transfer Server.Transfer()不会更改地址栏,我们无法回击。当他/她不希望用户看到他要去的地方时,应该使用Server.Transfer()。有时在“正在加载”类型页面上。它将当前页面请求传输到同一服务器上的另一个.aspx页面。它可以保留服务器资源,并避免不必要的往返服务器。它保留查询字符串和表单变量(可选)。它不会在用户Web浏览器中重定向请求的位置显示真实URL。Server.Transfer发生在浏览器不知道任何内容的情况下,浏览器请求一个页面,但是服务器返回了另一个的内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.