2010-08-24 63 views
1

我正在爲客戶端(ASP.NET,T-SQL)開發網站。這是一個數據錄入網站,允許他們的許多用戶在同一個數據庫中登錄和操作記錄。ASP.NET 2身份驗證用戶之間的會話狀態

整個表單中都有說明(基本上是一個字符串列表),告訴用戶每個部分要做什麼;這些說明本身就存在於數據庫中。

在每次登錄時,我將這些指令存儲在每個經過身份驗證的用戶的Session []對象中。這些說明對每個人都是一樣的。

我看了一個解決方案,建議在數據庫中存儲一個公共會話標識符,然後查詢它重新使用該特定的會話,但這似乎很hacky。什麼是最佳實踐解決方案來實現這一目標?是否有所有用戶都可以使用「通用」對象?

+0

你有沒有考慮過System.Web.HttpRuntime.Cache? - http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx – 2010-08-24 21:34:08

+0

感謝接受 - 只是出於好奇,你最終選擇了什麼選擇? =) – Rob 2010-08-27 17:14:13

+0

@Rob:抱歉花了這麼長時間回覆,我沒有注意到你的消息。我最終將這些字符串存儲在會話對象中,因爲它是正確的 - 它們足夠小以至於不起眼。此外,我們將Cookie超時設置爲〜1小時,並且在登錄/註銷時會話被清除,以便他們每天開始工作時獲得「最新」指示。謝謝你的幫助! – Alex 2010-11-06 00:36:48

回答

4

Fi首先,這一點是否重要?是的,這是不好的做法和不足,但是如果你在存儲器中存儲20Kb的字符串,並且最多有100個用戶,那就是2,000Kb的數據。很少有記憶被「浪費」了。即使在200Kb的字符串,這也是20,000Kb的數據。再次,不是很多。這是否值得你花時間,而客戶正在等待你解決它,現在呢?

如果你決定是,那麼你可以:

  1. 商店中Application對象或讓他們在檢索一次,多次使用一個靜態類的字符串。
  2. 檢索每個頁面視圖上的字符串。這可能不像看起來那樣損害業績。
  3. 在System.Web.Caching中使用類似Cache class的東西。
  4. 利用Output Caching
  5. 使用Windows Server AppFabric "Velocity" memory cache
2

聽起來像你正在尋找應用程序緩存。像會話一樣,它是一個內存中的數據緩存。與會話不同,它在所有用戶中共享;每個用戶都沒有獲得他們自己的個人數據副本。另外,當你向緩存中添加數據元素時,你可以指定一些標準,這些標準會自動使這些數據無效,並重新加載/刷新數據(當你很少改變的數據實際上會改變時很有用:)。

這裏的一些文章應該給你你需要知道如何使用應用程序緩存(並在ASP.NET一些其他的緩存選項以及)的一切:

+0

謝謝你的回答,但我只能接受一個:] – Alex 2010-08-27 19:55:33

1

我建議使用應用程序級緩存對象。它作爲HttpContext的一部分到處可用。你可以在App_Start上填充它。

您可以將任何類型的對象放入緩存中,但顯然,越小越好。

下面是如何使用C#來填充它的一些例子:

1)將項目添加到緩存中,你會通過指定項目的關鍵&值項添加到字典中。 示例:將當前文本框的Value屬性添加到緩存中。

Cache["txt1"] = txtName.value; 

Cache["result"] = dataset; 

2)Insert方法被重載,允許你定義爲您所使用的版本的參數的值。 示例:僅添加項目密鑰& value:

Cache.Insert(「MyData1」,connectionString);

3)Add方法與Insert方法具有相同的簽名,但它返回表示您添加的項目的對象。

Cache.Add("MyData1", connectionString); 

從緩存中檢索:

stringName = Cache["MyData"]; 

如果緩存數據不是字符串,您可能需要將其轉換爲正確的數據類型。

result = (DataSet)Cache["result"]; 

對使用​​,而不是應用程序對象緩存對象的好處是,如果系統在運行內存不足的危險CLR將轉儲高速緩存的內容。

+0

謝謝你的回答,但我只能接受一個:] – Alex 2010-08-27 19:56:15

相關問題