2011-02-01 90 views
2

我有多域Web應用程序,它根據用戶使用的URL來區別對待用戶。如果會話超時,global.asax中的session_start會發生什麼情況?

我正在使用Session [「data」]保留有關用戶的信息,並使用Global.asax中的Session_Start [「data」]啓動此會話。

所有的工作都很好,但我想知道在不活動後會發生什麼。經過一定的時間後會超時。如果發生這種情況,Global.asax會將其視爲新用戶並將再次爲此用戶啓動Session_Start?

並且Session [「data」]會隨每次頁面加載/重新加載而更新嗎?或者因爲它只啓動一次,並在某個確切的時間超時?

我試圖讓這個問題儘可能的清楚。

謝謝。

回答

3

每次服務器被該用戶擊中時,會話都會更新/保持活動狀態。您在Web配置文件中設置了超時值,並且它是滑動值,因此每次有服務器請求時都會重新啓動。

是這樣的:

<configuration> 
    <sessionstate 
     mode="inproc" 
     cookieless="false" 
     timeout="20" /> 
</configuration> 

當會話超時,下一次有一個請求,在session_start將執行。如果您從代碼中的任何其他位置訪問Session [數據],則應該檢查以確保它不爲null,因爲如果會話超時並且您試圖訪問它,它將拋出NullReferenceException。

+1

因此,如果用戶保持活躍,直到然後用戶停止使用應用程序的session_start將開始一次運行? – feronovak 2011-02-01 00:28:38

2

當用戶第一次訪問您網站上的.NET URL(如.aspx頁面,但不是.html或其他靜態文件)時,新會話開始。該會話持續到它超時或應用程序被終止(重新啓動/崩潰/再循環)。默認的.NET超時是20分鐘;因此只要用戶持續點擊.aspx頁面並且中斷時間不超過20分鐘,會話就會持續。

在此期間,您可以將信息存儲在與該用戶相關的Session對象中。它本質上是一個散列表,您可以使用您定義鍵的對象填充它。在你的情況下,你正在使用Session [「data」],但是你可以使用任何你想要的鍵,真的。

然而,會話以及存儲在Session哈希表中的數據非常脆弱(請參閱上述所有方法)。你不應該依賴它來保留任何重要的東西,例如在Session_Start中不能輕易重建的東西。所以它確實服務於兩個角色:維護狀態(所以你知道它在每個頁面中仍然是同一個用戶);並作爲用戶特定的緩存,您可以將數據保存在內存中以更快地完成任務。

Session_Start每個會話只運行一次 - 根據定義。如果您需要通過多個會話識別單個用戶,則需要使用更持久的方法,例如設置自己的Cookie,並且將來可能會失效。你可以在這樣一個cookie中放入一個ID,讓你知道這是用戶12345(事實上,Session_Start只是尋找你的「永久」cookie並將你的關於該現有用戶的數據連接到這個新會話的地方)。

如果要存儲有關多個會話中存活的用戶的數據,則必須將該數據存儲在更永久的位置 - 數據庫是最明顯的解決方案。當他們回來時,您可以在Session散列表中緩存一些數據 - 而Session_Start也是這樣做的地方。希望這可以幫助。

0

保護無效在session_start(對象發件人,EventArgs的){ // 代碼,當一個新的會話啓動

string RootURL = Request.ApplicationPath; 
    if (!RootURL.EndsWith("/")) 
     RootURL += "/"; 
    Globals._rootURL = RootURL; 
} 
相關問題