簡體   English   中英

ASP.NET會話

[英]ASP.NET Session

有沒有辦法擁有不同的會話狀態? 與之類似,會話中存儲了不同的對象,但具有不同的到期時間

即:

我有兩個會話對象,Session [“ ReportIDs”]和Session [“ IsAdmin”]

Session [“ ReportIDs”]-保留正在查看的報告ID,並且在當前用戶查看新報告時可以將其覆蓋。 Session [“ IsAdmin”]-從數據庫中讀取,我不想不斷地調用數據庫來獲取刷新值,因此將其存儲在會話中。 但是,如果userB更改了UserA的該對象的值(在管理屏幕中),則會話中的值將一直保留到在web.config中設置的整個會話狀態超時為止

有沒有辦法為這些會話對象設置不同的到期時間?

謝謝

您不能對會話中存儲的特定對象設置超時。

可以做的是添加另一個值,例如,說有日期的LatestRealAdminCheck。 然后,不要直接檢查Session [“ IsAdmin”],而是要通過某種方法檢查LastestRealAdminCheck來查看是​​否是再次訪問數據庫的方法。

另一種解決方案是不將IsAdmin值存儲在用戶特定的Session值中,而是存儲在全局單例(或Application值)中。 在這種情況下,您將需要一個用戶ID 列表以及該用戶是否是管理員。

會話是每個用戶維護的,這意味着即使您使用相同的密鑰,每個用戶在會話中存儲在相同密鑰下的內容也會有所不同。 換句話說,用戶A無法覆蓋用戶B的數據。

Cache是​​另一回事:Cache是​​為整個應用程序共享的,它將/將被一個用戶覆蓋到另一個用戶。 緩存確實具有到期和其他功能,例如在緩存的對象過期時自動掛接到某個事件,以便可以自動刷新等。

結論:會話是每用戶。 緩存在所有用戶之間共享。

編輯更新我的答案以正確解決telsokari的問題:

會話對象不會過期,直到會話本身過期。 在一定時間后,無法告訴會話“過期”一個對象。 您可以手動刪除它們。 只需掛接到應用程序中的任何事件,例如Begin_Request和End_Request。

但是我不明白在用戶注銷或會話期滿之前,您對在Session中維護對象的關注是什么...如果您在Session中放入大量數據,那么也許您不應該首先緩存這些數據。 如果您要放置大小可管理的對象,那是什么問題? 問題不應該是“我應該何時在Session中使該對象到期”? 而是:“將對象存儲在Session中,是否存儲在Cache中是否有意義?” 答案完全取決於您的具體情況,可用的硬件資源(內存)等。

每個用戶和沙盒的會話是分開的。 您可以一次分配IsAdmin ,它將在該用戶的會話中保持活動狀態。 您可以隨意更改ReportIDs ,但這僅適用於該用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM