C# 应用程序_End()无法通过HttpContext.Current.cache[key]访问缓存
我希望能够在应用程序重启之间维护某些对象 为此,我想在Global.asaxC# 应用程序_End()无法通过HttpContext.Current.cache[key]访问缓存,c#,asp.net,caching,httpcontext.cache,application-end,C#,Asp.net,Caching,Httpcontext.cache,Application End,我希望能够在应用程序重启之间维护某些对象 为此,我想在Global.asaxApplication\u End()函数中将特定的缓存项写入磁盘,然后将它们重新加载回Application\u Start() 我目前有一个cache helper类,它使用以下方法返回缓存值: return HttpContext.Current.Cache[key]; 问题:在应用程序_End()期间,HttpContext.Current为空,因为没有web请求(这是一个自动清理过程)-因此,我无法访问.Ca
Application\u End()
函数中将特定的缓存项写入磁盘,然后将它们重新加载回Application\u Start()
我目前有一个cache helper类,它使用以下方法返回缓存值:
return HttpContext.Current.Cache[key];
问题:在应用程序_End()
期间,HttpContext.Current
为空,因为没有web请求(这是一个自动清理过程)-因此,我无法访问.Cache[]
以检索任何要保存到磁盘的项目
问题:如何在
应用程序_End()
期间访问缓存项?我强烈建议您重新考虑您的方法。你可能想描述你想做什么的细节,所以我们可能会帮助你。
但是,如果您完全设置了它,那么您可以在实际设置值时将值保存在磁盘上,即,您的帮助器类将如下所示:
public static class CacheHelper
{
public static void SetCache(string key, object value)
{
HttpContext.Current.Cache[key] = value;
if (key == "some special key")
WriteValueOnDisk(value);
}
}
作为替代解决方案,您可以将数据存储在应用程序对象(应用程序[键])中,或者只需创建一个
静态类
,并使用它将数据保存在应用程序中-在这种情况下,数据将在应用程序结束时可用。如果您希望在释放缓存对象之前访问它,您需要使用类似这样的方法将对象添加到缓存:
将命名空间System.Web.Caching导入到正在使用向缓存添加对象的应用程序中
//Add callback method to delegate
var onRemove = new CacheItemRemovedCallback(RemovedCallback);
//Insert object to cache
HttpContext.Current.Cache.Insert("YourKey", YourValue, null, DateTime.Now.AddHours(12), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, onRemove);
当该对象将被处置时,将调用以下方法:
private void RemovedCallback(string key, object value, CacheItemRemovedReason reason)
{
//Use your logic here
//After this method cache object will be disposed
}
当您没有可用的HttpContext时,可以通过HttpRuntime.cache访问缓存。然而,在应用程序端,我相信缓存已经刷新了
Dima Shmidt大纲解决方案将是存储缓存值的最佳方法。也就是说,使用CacheItemRemovedCallback将项目添加到缓存中,并将值存储到磁盘。应用程序执行大量“脏”写入/更新(站点运行状况、遥测等),而更新太频繁,无法始终将其写入磁盘。只是想在应用程序重启之间保留它们。谢谢,Denis-数据数组可能太大了-还有其他方法访问缓存吗?问题是它不可用,因为没有请求-但缓存必须至少在某种程度上仍然可以访问?好的,另一个建议是在向缓存添加项目时提供CacheItemRemovedCallback()-回调中提供的方法在应用程序结束之前自动触发。。除非你在应用程序中的其他地方手动清除缓存,否则效果很好。既然缓存在你的应用程序中扮演着重要角色,为什么不利用AppFabric缓存/Velocity()。。我认为它会在重启之间自动保留缓存,并提供更多好处。如果您使用的是静态类,那么您还应该关心锁