服务器之间的区别是什么。转移和响应。重定向?

它们各自的优点和缺点是什么? 什么时候一种比另一种更合适? 什么时候不合适?


当前回答

更多关于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 does not verify that the current user is authorized to view the resource delivered by the Execute method. Although the ASP.NET authorization and authentication logic runs before the original resource handler is called, ASP.NET directly calls the handler indicated by the Execute method and does not rerun authentication and authorization logic for the new resource. If your application's security policy requires clients to have appropriate authorization to access the resource, the application should force reauthorization or provide a custom access-control mechanism. You can force reauthorization by using the Redirect method instead of the Execute method. Redirect performs a client-side redirect in which the browser requests the new resource. Because this redirect is a new request entering the system, it is subjected to all the authentication and authorization logic of both Internet Information Services (IIS) and ASP.NET security policy. -from MSDN

其他回答

传输完全是服务器端的。客户端地址栏保持不变。请求之间上下文的传输有些复杂。刷新和重新启动页面处理程序可能是昂贵的,所以在管道的早期进行传输,例如在BeginRequest期间的HttpModule中。仔细阅读MSDN文档,并测试和理解HttpContext的新值。请求——特别是在回发场景中。我们通常使用服务器。转换为错误场景。

重定向以302状态终止请求,客户端往返响应并在内部吃掉一个异常(轻微的服务器性能打击-取决于你每天做多少)客户端然后导航到新地址。浏览器地址栏和历史更新等。客户端支付额外的往返费用-费用取决于延迟。在我们的业务中,我们重定向了很多,我们编写了自己的模块来避免异常成本。

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

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

当我不想让用户看到我要去哪里时,我使用Server.Transfer()。有时在“加载”类型的页面上。

否则,我将总是使用Response.Redirect()。

响应。重定向只是向浏览器发送一条消息(HTTP 302)。

服务器。传输在浏览器一无所知的情况下发生,浏览器请求一个页面,但服务器返回另一个页面的内容。

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

我们希望将请求重定向到我们服务器上的一些普通HTML页面或其他web服务器 我们不关心在每个请求上引起到服务器的额外往返 我们不需要保留原始请求中的查询字符串和表单变量 我们希望我们的用户能够看到新的重定向URL,他在他的浏览器重定向(并能够收藏它,如果它的必要)

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

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

除了ScarletGarden的评论,你还需要考虑搜索引擎和你的重定向的影响。这个页面永久移动了吗?暂时的?这很重要。

看:响应。重定向vs。“301永久移动”:

We've all used Response.Redirect at one time or another. It's the quick and easy way to get visitors pointed in the right direction if they somehow end up in the wrong place. But did you know that Response.Redirect sends an HTTP response status code of "302 Found" when you might really want to send "301 Moved Permanently"? The distinction seems small, but in certain cases it can actually make a big difference. For example, if you use a "301 Moved Permanently" response code, most search engines will remove the outdated link from their index and replace it with the new one. If you use "302 Found", they'll continue returning to the old page...