簡單來說,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的學習筆記 - [ASP.NET]Response.Redirect 與Server.Transfer差別
沒有留言:
張貼留言