重定向 - Response.Redirect(url) versus Server.Transfer(url,false)

创建时间:
2014-04-26 10:18
最近更新:
2018-05-29 17:26

服务器端重定向: Web.config 文件 - <configuration> 节 - <system.web> 节 - <urlMappings>

  1. MSDN: urlMappings 元素 (ASP.NET 设置架构) - 定义一个映射,该映射隐藏实际的 URL 并将其映射到用户更容易记忆的 URL。
  2. 支持正则表达式的 UrlMapping (ASP.NET 2.0)
  3. urlMappings 与 URL 映射

Response.Redirect(url) versus Server.Transfer(url,false)

C# 执行 Response.Redirect(url) 后,会终止当前页的执行。
C# 执行 Response.Redirect(url) 后,会将响应头中的状态码设置为 302 (例如 HTTP/1.1 302 Found),并将响应头中的属性 Location 设置为实参 url 的值。用户代理收到响应,因报头中状态码为 302,即将地址栏设置为响应头中的属性 Location 的值并请求之。
有网友说:
Reflect 看 ttpResponse 类的 Redirect 方法,该方法实际上就是:

this.StatusCode = 0x12e;        //状态码为 302
this.RedirectLocation = url;    //客户端执行跳转

C# 执行 HttpServerUtility.Transfer(url,false) 后,会终止当前页的执行,并使用 url 实参来开始执行一个新页。
url 实参应指向 .aspx 页,指向 .asp 或 .asmx 页无效。
HttpServerUtility.Transfer(url) 重载保留 QueryStringForm 集合,所以 Tony 通常使用 HttpServerUtility.Transfer(url,false)
执行此方法后,响应头中的状态码仍为 200,用户代理地址栏中的网址不会被改变,因为此方法在服务器端进行了跳转。

相同点:
两者执行后,均调用 HttpResponse.End(),该方法在完成时引发 ThreadAbortException 异常。

结论:
Tony 倾向于使用 Response.Redirect(url):因为 Server.Transfer(url,false) 仅节约了报头信息的往返,性能提高并不大;而 Response.Redirect(url) 清晰的 URL 无论对于终端用户,还是开发调试,都有很重要的作用。