HttpCacheability.Private未按预期工作

时间:2012-02-28 19:32:05

标签: asp.net caching

我需要在客户端缓存一些小数据对象。它是用户信息,如姓名和角色。我有HttpCacheability.Private集。当我使用Fiddler查看页面时,我可以看到缓存是私有的,而不是为每个用户存储缓存,当不同的用户导航到站点时,它显示首先登录的用户的缓存值。我好像在存储服务器的价值。

例如,缓存在10分钟后到期。缓存过期后,我转到该网站。缓存为空,因此它从db(基于当前登录用户)查找我的用户信息并将其写入缓存。现在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"];
        }

1 个答案:

答案 0 :(得分:0)

context.Cache是服务器端缓存,这就是数据所在的位置。没有办法改变这一点。存储在那里的数据只能通过服务器端代码访问。

另一方面,context.Response.Cache是一个指令,作为http标头传递,告诉浏览器和中间代理,是否将响应从服务器缓存到浏览器。

因此,下一步是通过缓存数据来更多地了解您要完成的任务。您是在尝试减少从网络服务器到数据库的点击量,还是减少对网络服务器的点击量?

如果您正在尝试减少数据库命中,请坚持使用context.Cache代码,进行更改,以便该密钥具有一些唯一标识符,表明您正在存储/检索的用户。摆脱cachePolicy.SetCacheability开始,这样就不会混淆事情。

如果您尝试减少对网络服务器的点击量,请坚持使用cachePolicy.SetCacheability代码并暂时取消context.Cache代码。

相关问题