我希望能够在应用程序重启之间维护某些对象。
为此,我想在Global.asax Application_End()
函数中将特定的缓存项目写入磁盘,然后将其重新加载到Application_Start()
上。
我目前有一个缓存助手类,它使用以下方法返回缓存的值:
return HttpContext.Current.Cache[key];
问题:在Application_End()
期间,HttpContext.Current
为空,因为没有网络请求(这是一个自动清理程序) - 因此,我无法访问.Cache[]
检索要保存到磁盘的任何项目。
问题:如何在Application_End()
期间访问缓存项?
答案 0 :(得分:3)
如果你希望在处理缓存对象之前获得对它的访问权限,你需要使用这样的一些思想来将对象添加到缓存中:
将命名空间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
}
答案 1 :(得分:1)
我强烈建议你重新考虑一下你的做法。您可能想要描述您想要做什么的具体细节,因此我们可能会帮助您。 但是如果你完全设置它,那么你可以在实际设置时简单地将值保存在磁盘上,即你的帮助程序类看起来像这样:
public static class CacheHelper
{
public static void SetCache(string key, object value)
{
HttpContext.Current.Cache[key] = value;
if (key == "some special key")
WriteValueOnDisk(value);
}
}
答案 2 :(得分:1)
当您没有可用的HttpContext时,您可以通过HttpRuntime.Cache访问缓存。但是,在Application_End,我相信缓存已经刷新。
解决方案Dima Shmidt概述了存储缓存值的最佳方法。这是通过使用CacheItemRemovedCallback将项目添加到缓存中,并将值存储到磁盘中。
答案 3 :(得分:0)
作为替代解决方案,您可以将数据存储在Application对象(Application [key])中,或者只是创建一个static class
并使用它来将您的数据保存在应用程序中 - 在这种情况下,数据将在Application_End。