2011-05-05 99 views
2

我對ASP.NET中會話的生命週期有些困惑,這裏是我的測試用例。會話生命週期問題

用戶登錄,我保存一些信息到會話變量(例如Session["bob"]="bob"),然後我做一個「IIS重置」。用戶仍然登錄,但會話數據是null(如Session["bob"].ToString()拋出一個NullReferenceException

我所期望的會話數據仍然在身邊。有什麼我可以做的,比註銷的用戶之外?我的預期只要用戶仍然登錄,會話數據就會一直存在。

任何好的鏈接,所以我想了解發生了什麼,以及任何有關實際問題的幫助,我都非常感激。沒有能夠框架的方式來獲得我想要的方式。

+0

請張貼您的代碼 - 您的問題很不清楚。 – Oded 2011-05-05 16:28:09

回答

7

您所看到的行爲,檢查會議 - 其中Session內容沒有生存的一個IIS重置事件 - 是由於存儲會話值在哪裏。默認情況下,這些值存儲在ASP.NET「工作進程」的內存中,該工作進程是運行ASP.NET網站的程序。

執行「IIS重置」時,將關閉整個IIS服務器,包括ASP.NET工作進程。這意味着Session的內容將從內存中刪除。您的用戶似乎仍然登錄,因爲它由存儲在瀏覽器中的cookie控制。如果cookie仍然有效,則登錄是。

如果您希望您的會話狀態在IIS重置(或導致ASP.NET輔助進程重新啓動的其他任何事情)中生存,則需要將Session對象存儲在其他位置。 ASP.NET通過使用不同的Session存儲「模式」完全支持此功能。閱讀有關MSDN文章「Session-State Modes」中的內容。

有關會話的一般概述,請查看MSDN上的「ASP.NET Session State Overview」文章。

0

yah它的權利,但它的一些時間發生然後會議沒有正確刪除當時

你有一個像

If Session("username") = nothing then 

Response.redirect("~/default.aspx") 

End if 
+0

Global.asax中的哪個事件我應該測試一下?我以爲我記得之前做過,但我失敗了,找到了正確的事件。 – 2011-05-05 19:24:59

+1

simple session_start – 2011-05-06 11:46:04

+0

在會話啓動時,Sessio [「bob」]不會總是== null,因此它總是會將您重定向到登錄頁面,甚至是第一次嘗試登錄時? – 2011-05-06 14:21:29