[ASP.NET]Response.Redirect與Server.Transfer差別
這是一個被問到爛掉的問題,其實兩者之間的差異我們可以很簡單的從puma下面這篇文章的圖示中看出來:
[ASP.NET]Response.Redirect與Server.Transfer概念介紹
簡單來說,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:
按下Button2執行Server.Transfer時,則只會對StartPage.aspx進行一次Request:
送一次與送兩次,在效能的考量上自然是送一次會比較好,那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)
- 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堂課》,為培養台灣未來的領袖而努力。 |