application_end()无法通过httpcontext.current.cache [key]访问缓存
-
08-10-2019 - |
题
我希望能够在应用程序重新启动之间维护某些对象。
为此,我想在global.asax中将特定的缓存项目写入磁盘 Application_End()
功能并重新加载它们 Application_Start()
.
我目前有一个缓存助手类,该类使用以下方法返回缓存值:
return HttpContext.Current.Cache[key];
问题: : 期间 Application_End()
, HttpContext.Current
由于没有Web请求(这是一个自动清理过程),因此无效 - 因此,我无法访问 .Cache[]
检索以保存到磁盘的任何项目。
问题: :如何在期间访问缓存项目 Application_End()
?
解决方案
如果要在处理之前要访问缓存对象,则需要使用这样的somethink将对象添加到缓存:
导入命名空间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
}
其他提示
我强烈敦促您重新考虑您的方法。您可能需要描述您要做什么的细节,因此我们可以为您提供帮助。但是,如果您完全设置了它,那么您可以在实际设置它们时简单地在磁盘上保存值,即您的助手类看起来像这样:
public static class CacheHelper
{
public static void SetCache(string key, object value)
{
HttpContext.Current.Cache[key] = value;
if (key == "some special key")
WriteValueOnDisk(value);
}
}
当您没有可用的httpcontext时,您可以通过httpruntime.cache访问缓存。但是,在application_end上,我相信缓存已经被冲洗了。
解决方案DIMA SHMIDT大纲将是存储您的缓存值的最佳方法。那就是将您的项目添加到使用CacheiteMremervedCallback中的缓存中,然后存储在此处磁盘的值。
作为替代解决方案,您可以将数据存储在应用程序对象(Application [key])中,或者简单地创建一个 static class
并使用它将数据保存在应用程序中 - 在这种情况下,数据将在application_end时可用。