我正在實施會話結構。如何處理打開的會話
我有一個ConcurrentDictionary
在服務器端持有所有<SessionId, UserSession>
對。
建立新連接時,根據RememberMe
選項將cookie分配給客戶端瀏覽器,perm或temp。
當客戶端調用LogOut
函數時,它會從字典中刪除會話。
但是,當客戶端瀏覽器簡單地關閉或崩潰,並且cookie丟失或過期或被刪除時,內存中的服務器端會話對象仍保留在字典中併成爲重影。隨着時間的推移,這些鬼魂會堆積起來。
我的問題是,如何改進設計,以便在死亡會話過期後可以清理?
我想過讓定時器服務運行一個清潔計劃,但感覺不夠優雅。有沒有更簡單的方法來做到這一點,而不依賴於外部服務?
最好是使用帶滾動條件的緩存或處理Session_End方法。你在UserSession中存儲什麼? – zimdanen
沒有可靠的Session_End方法來處理,如果客戶端瀏覽器崩潰,那麼它就在那裏結束,而不會回話到服務器。但現在你提到了一個緩存,我有一個想法,我可以存儲一個按LastActive時間排序的列表。每當新客戶端登錄時,他可以幫助檢查隊列中最早的會話,並在過期時刪除。當他呼叫服務器執行某些操作時,每個活動用戶都會將自己置於隊列的後面。所以,他成爲最新的活躍人物。 – Tom
您是否在某些時候需要查看有關已登錄的每個人的數據?如果沒有,爲什麼不將數據存儲在會話中(如果您需要數據)並在會話超時後讓它消失?如果存在壓力,那麼也可以通過將項目從Session中刪除來處理內存壓力。或者使用帶滾動超時的HttpContext.Cache,以便在上次訪問後的一段時間後消失。 (基本上,不需要推出自己的產品。) – zimdanen