[ASP.NET]Session的幾個有趣現象

[ASP.NET]Session的幾個有趣現象

今天在小舖上看到有人在問Session的問題,在找參考資料給他時意外發現一個之前自己忽略掉的東西,先來看看Session.Abandon這東西:

http://msdn.microsoft.com/en-us/library/ms524310.aspx

Definition:The Abandon method destroys all the objects stored in a Session object and releases their resources. If you do not call the Abandon method explicitly, the server destroys these objects when the session times out.

Remark:When the Abandon method is called, the current Session object is queued for deletion but is not actually deleted until all of the script commands on the current page have been processed.

之前以為Session.Abandon就等於立即Session time out了,結果沒想到他會等到整個porcess執行完才清除掉現在的Session物件,下面我們簡單測試一下:

我在Page_Load跟OnPreRender時分別透過Response.Write將SessionID寫到畫面上,接著我按下按鈕,不管我按下幾次,SessionID都不會變化:

image

這次我在Page_Load的程式碼後加上Session.Abandon(),再測一次看看:


Session.Abandon();

我們會有兩個發現:

1.Page_Load執行完Abandon後,在OnPreRender中取到的SessionID還是跟本來一樣,並沒有立刻產生一個NewSession

2.但按下按鈕後,SessionID就變了,代表Session確實被重新產生了

image

接著我再做個小試驗,在Abandon之後加入IsNewSession的判斷:



Session.Abandon();

if (Session.IsNewSession)
{
    Response.Write("IsNewSession");
    Response.Write(Session.SessionID);
}

結果發現,雖然判斷為IsNewSession,但SessionID仍然沒有改變,這倒是比較有趣的一個地方,在process過程中SessionID沒有改變,因此Session[key]在process完成前也都還是取得到的:

image 

 

接著看一下常被拿來比較的Session.Clear跟Session.RemoveAll,這兩者在用途上似乎沒有什麼兩樣,加上function的定義中也都是寫"從工作階段狀態集合中移除所有的索引鍵和值",Clear跟RemoveAll並不會造成Session物件被刪除,他只是將Session[key]這些內容全部移除而已,下面測試一下:


Response.Write(Session["Test"].ToString());
Session.Clear();
Response.Write(Session["Test"] != null ? Session["Test"].ToString() : "Session[\"Test\"] Is null");

結果是Session的內容馬上就被清掉了,

image

對照到Session.Abandon的結果:


Response.Write(Session["Test"].ToString());
Session.Abandon();
Response.Write(Session["Test"] != null ? Session["Test"].ToString() : "Session[\"Test\"] Is null");

Session的值仍然還在,這代表Clear是立刻清掉Session物件集合的內容,而Abandon則是在process完後才清掉,

image

最後一個有趣現象是我在測試這個部份時使用的是ASP.NET的虛擬伺服器,建立好後我把SessionID寫到畫面上,卻發現每次postback後SessionID都不一樣,但我明明就沒有做Abandon阿,後來想說大概是web.config中沒有設定SessionState吧,把這行加入到System.web中,加上去後就一切正常囉。

游舒帆 (gipi)

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