Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 页面刷新后,HttpContext.Current.Cache项为空_C#_Caching_Web - Fatal编程技术网

C# 页面刷新后,HttpContext.Current.Cache项为空

C# 页面刷新后,HttpContext.Current.Cache项为空,c#,caching,web,C#,Caching,Web,我有一个C#网页,在其中我使用HttpContext.Current.cache将列表对象存储在服务器缓存中。加载第一页后,对象保存在缓存中。但当我刷新页面时,缓存对象为空。有什么想法吗 另外,我想设置一个“作业”,每30分钟重新创建一次对象。我希望在创建新版本之前提供缓存版本,然后用新版本替换旧版本。 我该怎么做 在我的Global.asax中的应用程序_Start中,我有以下内容: HttpRuntime.Cache.Insert("MainADList", Uf.GetUsers(), n

我有一个C#网页,在其中我使用HttpContext.Current.cache将列表对象存储在服务器缓存中。加载第一页后,对象保存在缓存中。但当我刷新页面时,缓存对象为空。有什么想法吗

另外,我想设置一个“作业”,每30分钟重新创建一次对象。我希望在创建新版本之前提供缓存版本,然后用新版本替换旧版本。 我该怎么做

在我的Global.asax中的应用程序_Start中,我有以下内容:

HttpRuntime.Cache.Insert("MainADList", Uf.GetUsers(), null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30));
 MainADList = (Users)HttpRuntime.Cache["MainADList"];
当我需要它时,我会执行以下操作:

HttpRuntime.Cache.Insert("MainADList", Uf.GetUsers(), null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30));
 MainADList = (Users)HttpRuntime.Cache["MainADList"];

这在很大程度上是空的。不总是,但几乎总是。

可以改用
系统.Runtime.Caching
吗。这样,您就不依赖于HttpRuntime名称空间

我怀疑您正在获取null,因为.Net正在清除它,因为web服务器重新启动。按照这条路线做点什么会更好吗

    public List<User> GetUsers()
    {
        var cache = System.Runtime.Caching.MemoryCache.Default;
        if (cache["MainADList"] == null)
        {
            // Rebuild cache. Perhaps for Multithreading, you can do object locking
            var cachePolicy = new System.Runtime.Caching.CacheItemPolicy() { AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(30) };
            var users = Uf.GetUsers();
            cache.Add(new System.Runtime.Caching.CacheItem("MainADList", users), cachePolicy);

            return users;
        }

        return cache["MainADList"] as List<User>; 
    }
公共列表GetUsers()
{
var cache=System.Runtime.Caching.MemoryCache.Default;
如果(缓存[“MainADList”]==null)
{
//重建缓存。也许对于多线程,您可以执行对象锁定
var cachePolicy=new System.Runtime.Caching.CacheItemPolicy(){AbsoluteExpiration=DateTime.Now+TimeSpan.FromMinutes(30)};
var users=Uf.GetUsers();
cache.Add(new System.Runtime.Caching.CacheItem(“MainADList”,users),cachePolicy);
返回用户;
}
将缓存[“MainADList”]作为列表返回;
}

即使您使用
cache.noabsoluteexption
+
cache.NoSlidingExpiration
填充缓存,ASP.NET也可以从缓存中删除项目(即:当可用系统内存不足时)

CacheItemPriority.NotRemovable
传递到Cache.Insert()以防止发生这种情况

长空闲时间重启IIS应用程序池、web.config/binary更改等也会擦除缓存。检查

关于创建作业以刷新缓存;我不认为最好的缓存策略有经验法则。这在很大程度上取决于用户与网页的交互方式、频率、并发程度,特别是缓存未命中时生成数据所需的时间

如果任何用户都无法接受生成数据所需的时间,则可以设置刷新缓存的作业,但其间隔应小于生成/检索所需的缓存TTL+时间之和。
例如,如果缓存为30m,生成数据需要2m,则刷新间隔必须小于等于28m,以避免任何用户命中空缓存

也许浏览器中的cookies已关闭?您能否使用Fiddler或浏览器的开发工具监视http通信,并确保会话令牌与您的刷新请求一起发送?可能您的iis池正在重新启动,我遇到了类似的问题,而发生这种情况是因为iis池因iis错误而重新启动,请查看
事件查看器
,然后,您确定
Uf.GetUsers()
没有返回空值吗?看看这篇文章:我确信Uf.GetUsers()正在返回一个值,并且该值存储在缓存中。第一次,通常是第二次,它成功地从缓存中检索对象。我认为缓存正在被清除或在创建后的1-2分钟内超时。可能是由于某种原因,您的缓存正在清除自身。你可以在谷歌上搜索这个,或者在这里查看这个,所以: