2010-07-01

[Asp.Net][轉貼]Response.Redirect 與Server.Transfer差別

用 Server.Transfer會比用Response.Redirect少了一個Response和Requested..減少了一次 Server與Client的往返

 
border=0


簡單來說,Response.Redirect會由Client送出兩次 的Request,Server.Transfer則是一次,這個部分我們可以從下方的簡單範例中觀察到,我在畫面上放兩個按鈕,一個執行 Response.Redirect,另一個執行Server.Transfer:
using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;
public partial class StartPage : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {
    }

    protected void Button1_Click(object sender, EventArgs e)

    {

        Response.Redirect("EndPage.aspx");

    }

    protected void Button2_Click(object sender, EventArgs e)

    {

        Server.Transfer("EndPage.aspx");

    }

}
按 下Button1執行Response.Redirect時,會分別對StartPage.aspx與EndPage.aspx送出 Request:
image


按 下Button2執行Server.Transfer時,則只會對StartPage.aspx進行一次Request:
image


送 一次與送兩次,在效能的考量上自然是送一次會比較好,那Response.Redirect何時該使用呢?我們可以參考這篇下面的說明:
What is the difference between server.transfer and response.redirect methods
Response.Redirect should be used when:
  • we want to redirect the request to some plain HTML pages on our server or to some other web server
  • we don't care about causing additional roundtrips to the server on each request
  • we do not need to preserve Query String and Form Variables from the original request
  • we want our users to be able to see the new redirected URL where he is redirected in his browser (and be able to bookmark it if its necessary)
Server.Transfer should be used when:
  • we want to transfer current page request to another .aspx page on the same server
  • we want to preserve server resources and avoid the unnecessary roundtrips to the server
  • we want to preserve Query String and Form Variables (optionally)
  • we don't need to show the real URL where we redirected the request in the users Web Browser


幾個點 可以注意:
1.Response.Redirect可以跨越不同的WebSite;Server.Transfer則只能在同一個 WebSite中
2.Response.Redirect會顯示真的轉址後的網址;Server.Transfer則會保留本來的網址(可 以看上面兩張圖 Response.Redirect執行後的網址是EndPage.aspx,但Server.Transfer仍然是StartPage.aspx)
3.Response.Redirect 送出的是一個全新的Request,所以本來的QueryString跟Form變數將不會保留;相對的 Server.Transfer則可以選擇保留


由 這邊衍生出之前被問過的一個問題,我有兩台Server A跟B,在B中有設定可存取的來源IP,其中有定義了A的IP,也就是說A是具有存取B的權限,但我的使用者目前只能連結到A的WebSite,我能否透 過Response.Redirect或者Server.Transfer去存取B?
答:Server.Transfer因為無法跨越 WebSite,先被淘汰了;Response.Redirect則因為會送出兩次 Request,且這兩次Request都是由 Client端直接送出,Client端的IP只要沒有被設定在B的可存取IP清單中,就會出現沒有權限的訊息,因為 Response.Redirect並不代表由A協助送 Request到B上,所以結論是兩個方法都不可行,正確的做法是 在B上佈署Service或者由A送出WebRequest 後去接受B的回傳內容。


資料來源: gipi的學習筆記 - [ASP.NET]Response.Redirect 與Server.Transfer差別

沒有留言:

張貼留言