5

我了解 Server.Transfer 不会往返于请求客户端。

我无法了解的是,控制权是否直接传递给您要转移到的新请求处理程序,或者是否或是否再次执行整个请求生命周期。

我假设使用传输 URL 再次执行整个生命周期,但想验证情况是否如此。

4

2 回答 2

3

这是我通过实验发现的。

当使用Server.Transfer整个请求生命周期时不会再次运行。

如果您编写自己的模块,将其挂接到请求生命周期中,然后Server.Transfer从该模块调用,请求生命周期的其余部分将被跳过,页面生命周期将立即开始。

在完成传输页面生命周期后,请求生命周期会随着其拆除事件重新开始。请注意,用于拆卸事件的 HtppContext 将是您从中传输的原始事件。也就是说,URL 和 QueryString 值将与原始请求相同,而不是您转移到的页面的 URL 和 QueryString 值。

Server.TransferHttpContext.Request确实会在您转移到的页面的页面生命周期中修改对象以包含新的 URL 和 QueryString 信息。

如果您转移到一个不是页面而是基于文本的资源(例如,something.xml),则该页面的内容将完全按照其编码设置为 text/html 的方式返回。

如果您传输到一个不是页面且不是基于文本的资源(例如 something.pdf),则会引发 HttpException 错误。即使您为此资源定义了自定义处理程序,也会发生这种情况。

于 2012-06-25T17:22:10.840 回答
1

它只是传递,其状态完好无损。请求生命周期不会再次运行,尽管页面生命周期将为您转移到的页面运行。

http://msdn.microsoft.com/en-us/library/ms525800(v=vs.90).aspx

Server.Transfer 作为 Response.Redirect 方法的有效替代品。Response.Redirect 指定浏览器请求不同的页面。因为重定向强制一个新的页面请求,浏览器向 Web 服务器发出两个请求,所以 Web 服务器处理一个额外的请求。IIS 5.0 引入了一个新函数 Server.Transfer,它将执行转移到服务器上的不同 ASP 页。这避免了额外的请求,从而获得更好的整体系统性能以及更好的用户体验。

此链接也很有帮助 -
http://www.developer.com/net/asp/article.php/3299641/ServerTransfer-Vs-ResponseRedirect.htm

于 2012-06-25T15:52:07.277 回答