2011-07-10 179 views
47

問題#1C#清除會話

我想知道我什麼時候應該使用:

Session.Abandon() //當我在跟蹤期間使用,並調用它 - 後,我發現會議仍然有價值。

當我應該使用:

Session.Clear()

當我應該使用每個特定的方法是什麼?


  • 一般?
  • 在我的具體情況?

我檢查頁面加載中的會話是否不相等。如果會話等於空,我想清除會話並重定向到登錄頁面?

我應該使用這樣的事:

private void initSession() 
{ 
    Session.Clear(); 
    Session.Abandon(); 
    Response.Redirect("LoginPage.aspx"); 
} 
+0

[在ASP.NET中,我應該何時使用Session.Clear()而不是Session.Abandon()?](http://stackoverflow.com/questions/347377/in-asp-net-when - 我應該使用會話清除,而不是會話拋棄) –

回答

86

In ASP.NET, when should I use Session.Clear() rather than Session.Abandon()?

Session.Abandon()銷燬會話 和Session_OnEnd事件是 觸發。

Session.Clear()僅刪除Object中的所有 值(內容)。具有相同密鑰的 會話仍然是 還活着。

因此,如果您使用Session.Abandon(),那麼您的 會丟失該特定會話,並且 用戶將獲得新的會話密鑰。例如,當用戶 註銷時,您可以使用它 。

使用Session.Clear(),如果你要那 留在同一會話 (如果你不想讓他重新登錄的 例如)和重置所有他會話 特定數據的用戶。

What is the difference between Session.Abandon() and Session.Clear()

清除 - 刪除所有鑰匙,並從會話狀態集合值 。

放棄 - 刪除存儲在會話中的所有對象 。如果不這樣做 調用Abandon方法明確, 服務器將刪除這些對象和 破壞會話當會話 超時。它還引發了諸如 Session_End的事件。

Session.Clear可以比較 去除貨架, 所有書籍而Session.Abandon更像 扔掉了整個貨架。

...

一般來說,在大多數情況下,你需要使用 Session.Clear。如果您確定 用戶將要離開您的網站,您可以使用 Session.Abandon。

所以回區別:

  • 放棄引發Session_End中請求。
  • 立即清除物品,放棄不。
  • 放棄釋放SessionState對象及其項目,以便收集垃圾 。
  • 清除保留SessionState和與其相關的資源。

Session.Clear() or Session.Abandon() ?

您使用Session.Clear(),當你不希望 結束會話,而是 只是清除所有會話 密鑰和初始化會話。

Session.Clear()不會引起你的 Global.asax文件來執行 Session_End中事件處理程序。

但在另一方面 Session.Abandon()將完全消除 會話並且將執行 Session_End中事件處理程序。

Session.Clear()就像是從書架

Session.Abandon()就像是扔 書架本身刪除圖書 。

問題

我查了一些會議,如果不等於空的頁面加載。如果其中一個等於null,我想清除所有會話並重定向到登錄頁面?

回答

如果您希望用戶重新登錄,使用Session.Abandon。

+0

但調用'Session.Abandon()'後,我發現會話仍然保持其價值?! –

+1

非常感謝。很好的答案。 –

+0

非常好的帖子!很高興看到這方面的一些很好的信息。 – Peter

3

的另一大區別是放棄不立即刪除項目,但是當它清除它在會話項目一個循環來檢查STA COM對象,它需要特別處理。這可能是一個問題。

在高負載下,可能有兩個(或更多)請求將它送到同一會話的服務器(即具有相同會話cookie的兩個請求)。它們的執行將被序列化,但由於放棄不會同步清除項目,而是設置一個標記,因此兩個請求都可以運行,並且這兩個請求都會安排工作項目「稍後」清除會話。這兩個工作項目可以同時運行,並且都在檢查會話對象,並且都清除了對象數組,並且當您有兩件事情在列表上迭代並更改時會發生什麼?繁榮!由於這發生在一個queueuserworkitem回調中,而不是在try/catch中完成(感謝MS),它會降低整個應用程序域。到過那裏。