2011-02-24 112 views
3

快速的問題:是否有「每用戶」數據存儲對象(類似於Session),我可以存儲在全球範圍內(類似於HttpRuntime.Cache)數據?幾乎就好像SessionHttpRuntime.Cache有個孩子。.NET會話替代在全球範圍

全文背景:我有一個ASP.NET網站,最初是爲單個線程編寫的。現在我改變了它,以便某些操作產生後臺線程,瀏覽器輪詢服務以獲取狀態更新。

我遇到的問題是某些數據片段存儲在HttpContext.Session []對象(例如成員身份驗證令牌)中。這些數據片段必須對每個用戶都是唯一的,並且可以通過後臺線程訪問。會話不可用於後臺線程。

我知道HttpRuntime.Cache但這需要微觀管理來細分用戶,並在會話過期的同時過期。另一方面,Session會在我想要的正確時間自動過期,並已被SqlMembershipProvider之類的事情所使用。

我的問題是,有什麼行爲類似於會議,但存在於全球範圍內?

+2

+1爲sessioncache嬰兒。 – jlafay 2011-02-24 18:24:04

+0

@jlafay你居然讓我LOL – Kelsey 2011-02-24 18:25:59

回答

3

我不認爲有什麼像你需要開箱即用。我雖然做到以下幾點:

  1. 用戶應用程序緩存
  2. 使鑰匙的用戶ID或唯一標識符
  3. 存放在用戶的價值Dictionary或某個對象名單。使用它來存儲您需要的所有數據。
  4. 考慮用戶ID的所有預先考慮的東西,如果你認爲有可能是與用戶唯一標識符(例如域名等)
  5. 衝突務必設置到期類似的會話緩存的數據(例如滑動)
+0

似乎有可能會有一些危險 – Jeff 2011-02-24 18:48:23

+0

@Jeff危險?你能否詳細說明。如果你有權訪問'Cache',這個方法應該可以做你需要的一切。這只是一個混合動力。我不會推薦使用Alexei在評論中提到的會話複製方法。 – Kelsey 2011-02-24 21:13:21

+0

Ooops。我開始寫這個評論,但從來不打算髮送它。我甚至沒有意識到它被張貼,直到我得到這個迴應。這就是爲什麼它沒有任何意義。起初,我很關心範圍,但我自己做了一些事情。抱歉! – Jeff 2011-02-24 22:07:46

3

嘗試將HttpContext.Current對象傳遞給後臺線程上的方法。您應該能夠通過currentContext.Session假設currentContext從後臺線程訪問會話中傳遞的HttpContext參數。

看到這個blog post如何安全地從多個線程訪問的HttpContext對象。

+0

請求結束後上下文不可用(如OP情況下)。 – 2011-02-24 18:19:48

+0

好博文!當我第一次閱讀你的回覆時,我很興奮能夠通過上下文,但是現在在博客文章之後,我將不得不多花一點時間思考它是否真的安全以及我需要什麼。 – Jeff 2011-02-24 18:26:20

3

因爲當應用程序池重新啓動所有backgound活性死,我建議考慮移動用戶的狀態,以自己的數據庫或外部存儲。不幸的是,你將失去自動會話管理的優點(滑動到期),但是如果你需要背景活動,它會更好地工作 - 即你可以將活動從IIS進程移出,以便在稍後需要時分離進程/機器。

+0

我不擔心應用程序重新啓動時丟失數據。外部存儲會給我另一種訪問httpcontext之外的會話數據的方式。 – Jeff 2011-02-24 18:31:56

+0

在這種情況下,我會簡單地克隆Session的內容(因爲它是字符串到對象字典)並將其傳遞給工作線程。請注意,如果會話狀態中的內存狀態對象不是會話狀態中的數據副本(與SQL /會話服務狀態不同),請小心不要更改工作線程中的數據。 – 2011-02-24 19:02:54