C# 页面刷新后,HttpContext.Current.Cache项为空
我有一个C#网页,在其中我使用HttpContext.Current.cache将列表对象存储在服务器缓存中。加载第一页后,对象保存在缓存中。但当我刷新页面时,缓存对象为空。有什么想法吗 另外,我想设置一个“作业”,每30分钟重新创建一次对象。我希望在创建新版本之前提供缓存版本,然后用新版本替换旧版本。 我该怎么做 在我的Global.asax中的应用程序_Start中,我有以下内容: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
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分钟内超时。可能是由于某种原因,您的缓存正在清除自身。你可以在谷歌上搜索这个,或者在这里查看这个,所以: