[ASP.NET]Response.Redirect與Server.Transfer差別

[ASP.NET]Response.Redirect與Server.Transfer差別

這是一個被問到爛掉的問題,其實兩者之間的差異我們可以很簡單的從puma下面這篇文章的圖示中看出來:

[ASP.NET]Response.Redirect與Server.Transfer概念介紹

image

 

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


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)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。