2012-02-28 38 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