2011-09-07 43 views
1

有沒有辦法讓不同的會話狀態?作中,有存儲在會話不同的對象,但具有不同的到期ASP.NET會話

即:

我有兩個會話對象,會話[「ReportIDs」]和會話[「IsAdmin」]

會話[」 ReportIDs「] - 保存正在查看的報告ID,並且可以在當前用戶查看新報告時覆蓋。 會話[「IsAdmin」] - 從數據庫中讀取,我不想不斷地調用數據庫以獲取刷新值,以便將其存儲在會話中。但是,如果userB爲UserA更改此對象的值(在管理員屏幕中),會話中的值將一直保留,直到在web.config中設置的整個會話狀態超時爲止。有沒有一種方法可以爲不同這些會話對象?

感謝

回答

1

的會話是各自獨立爲每個用戶和沙盒。您可以分配IsAdmin一次,並且它將爲該用戶的會話保持活動狀態。您可以儘可能多地更改ReportIDs,但它只會針對該用戶。

+0

是的,我知道,我的意思是UserB可以改變USERA是否是管理員用戶或不在數據庫中。會議[「IsAdmin」]是持有這個價值。該值在到期前不會更新。這就是爲什麼我想爲此對象設置不同的超時時間 – telsokari

2

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

可以做的是添加另一個值,比如說LatestRealAdminCheck持有一個日期。然後不要直接檢查會話[「IsAdmin」],但通過檢查LastestRealAdminCheck以查看是否該再次點擊數據庫的某種方法。

另一種解決方案可能是不存儲在用戶特定的會話值IsAdmin值,但在一個全局單(或應用程序的值)。在這種情況下,您需要 user-id的列表以及該用戶是否爲管理員。

+0

應用程序級別將無法正常工作,因爲IsAdmin值可能因用戶的不同而不同,但我猜「LastestRealAdminCheck」的第一個選項可能會起作用 謝謝 – telsokari

+0

您將需要在該單例或應用程序中存儲(userid,isadmin)的**列表**。你是對的:一個單一的價值觀將不起作用,因爲這對每個人都是一樣的。 –

2

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

不同的是高速緩存:高速緩存是爲整個應用共享的,它可以/可以從一個用戶覆蓋到另一個用戶。高速緩存確實有過期和其他功能,如掛鉤的一些事情時,自動緩存的對象過期,以便它可以自動刷新等

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

編輯更新我的回答對妥善解決telsokari的問題:

Session對象不會過期,直到會議本身到期。沒有辦法告訴會話在一段時間後「過期」一個對象。如果這是你想要做的,你可以手動刪除它們。只需掛接到應用程序中的任何事件,如Begin_Request和End_Request。

但我不明白,直到用戶註銷或會話過期...如果你是把大量的會話數據,那麼也許你不應該緩存的數據你怎麼看在會話保持關注對象首先。如果您要放置可管理尺寸的對象,那麼問題是什麼?這個問題不應該是「我應該在Session中何時過期」?而是:「將對象存儲在Session中,緩存中還是根本不存在?」答案完全取決於你的具體情況,可用的硬件資源(內存)等等。

+0

這不是我所問的。我知道會話是每個用戶,我知道緩存是應用程序級別。每個用戶對存儲在DB用戶表中的IsAdmin都有自己的值。由於不是所有的用戶都是管理員使用緩存不會工作。我希望某些會話對象的會話在不同的時間到期,因此會話[「ReportID」]可能在60分鐘後過期,但會話[「IsAdmin」]在10分鐘後過期 – telsokari

+0

@telsokari:更新我的答案。看一看。 – Icarus