2012-02-28 41 views
1

我有一些我需要在客戶端緩存的小數據對象。這是用戶信息,如他們的名字和角色。我有HttpCacheability.Private集合。當我使用Fiddler查看頁面時,可以看到緩存是私有的,但不是爲每個用戶存儲緩存,而是當不同的用戶瀏覽到該網站時,它將顯示首先登錄的用戶的緩存值。我好像是在存儲服務器值。HttpCacheability.Private不按預期工作

例如,緩存在10分鐘內過期。緩存過期後,我去了網站。緩存爲空,因此它從數據庫中查找我的用戶信息(基於當前登錄用戶)並將其寫入緩存。現在,John Doe在我做完3分鐘後到達現場,他看到了我的信息而不是他的。

我不知道還需要做什麼來緩存每個用戶的信息在他們的客戶端,而不是服務器。任何幫助將被讚賞。

感謝,

朗達

public static void AddUserToCache(User userToCache, string Key) 
    { 
     HttpContext context = HttpContext.Current; 
     HttpCachePolicy cachePolicy = context.Response.Cache; 
     cachePolicy.SetCacheability(HttpCacheability.Private); 

     if (context.Cache[Key] == null) 
     { 
      context.Cache.Add(Key, userToCache, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(UIConstants.CACHETIMEOUTHOURS, 0, 0), System.Web.Caching.CacheItemPriority.Default, null); 
     } 
    } 




if (Cache["User"] == null) 
     { 
      user = BusinessUtility.GetCurrentUser(); 
      if (user != null) 
      { 
       CacheUtility.AddUserToCache(user, "User"); 

      } 

     } 
     else 
     { 
      user = (User)Cache["User"]; 
     } 
+0

我還應該提到,在我的代碼的原始版本中,我沒有cachepolicy的東西作爲私人應該是默認的。它不會以任何方式工作。 – Rhonda 2012-02-28 19:43:33

回答

0

context.Cache是一個服務器端緩存,這就是數據的生命。沒有辦法改變這一點。存儲在那裏的數據只能通過服務器端代碼訪問。

另一方面,context.Response.Cache是一個指令,作爲http頭傳遞,告訴瀏覽器和中間代理,是否緩存從服務器到瀏覽器的響應。

因此,下一步是通過緩存數據來更深入地瞭解您嘗試完成的任務。您是否嘗試將網絡服務器的點擊率降低到數據庫或者將點擊率降低到網絡服務器?

如果您試圖減少數據庫匹配,然後使用context.Cache代碼進行更改,以便密鑰具有某個唯一標識符,以確定您正在存儲/檢索哪個用戶。首先擺脫cachePolicy.SetCacheability,以免混淆。

如果您嘗試減少對網絡服務器的訪問次數,請堅持使用cachePolicy.SetCacheability代碼,並立即刪除context.Cache代碼。

+0

試圖減少到數據庫的命中。我向密鑰添加了一個唯一的ID,並將在服務器上進行測試。感謝您的迴應。 – Rhonda 2012-02-28 21:57:18