2010-12-12 43 views
4

我希望能够在应用程序重新启动之间维护某些对象。Application_End()无法通过HttpContext.Current.Cache访问缓存[key]

为此,我想在Global.asax Application_End()函数中将特定的缓存项写入磁盘,并将它们重新加载回Application_Start()

我现在有一个缓存辅助类,它使用以下方法返回缓存值:

return HttpContext.Current.Cache[key]; 

问题:在Application_End()HttpContext.Current为空,因为没有web请求(这是一个自动清理过程) - 因此,我无法访问.Cache[]来检索任何要保存到磁盘的项目。

问题:在Application_End()期间如何访问缓存项目?

回答

3

如果你想将配置之前,可以访问缓存的对象,您需要使用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 
} 
+0

**有用**也许:http://johnnycoder.com/blog/2008/12/10/c-cache-helper-class/ – 2015-08-05 15:45:30

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); 
    } 
} 
+0

该应用程序会进行大量的“脏”写入/更新(站点运行状况,遥测等)等,而且更新过于频繁,无法将其始终写入磁盘。只是想在应用程序重新启动之间保留它们。 – 2010-12-12 02:54:47

0

正如你可以存储数据的替代解决方案在应用程序对象(Application [key])中,或者简单地创建一个static class并使用它来将数据保存在应用程序中 - 在这种情况下,数据将在Application_End上可用。

+0

谢谢,Denis - 数据数组可能太大 - 有没有其他方法可以访问缓存?问题是它不可用,因为没有请求 - 但缓存必须仍然可以访问至少以某种方式? – 2010-12-12 02:57:32

+0

好吧,另一个建议是将项目添加到缓存时提供CacheItemRemovedCallback(http://msdn.microsoft.com/zh-cn/library/system.web.caching.cacheitemremovedcallback.aspx) - 回调中提供的方法会在应用程序结束之前自动启动..除非您在应用程序中的其他位置手动清除缓存,否则运行良好。 – 2010-12-12 03:17:20

+0

由于缓存在您的应用中扮演着重要角色 - 为什么不利用使用AppFabric缓存/速度(http://www.hanselman.com/blog/InstallingConfiguringAndUsingWindowsServerAppFabricAndTheVelocityMemoryCacheIn10Minutes.aspx)..我认为它会自动保留缓存重新启动加上会带来更多好处。 – 2010-12-12 03:22:33

1

您可以访问通过HttpRuntime.Cache缓存,当你没有可用的HttpContext的。但是,在Application_End,我相信缓存已经刷新。

Dima Shmidt概述的解决方案将是存储缓存值的最佳方法。这是通过使用CacheItemRemovedCallback将项目添加到缓存中,然后将值存储在磁盘上。

+0

这是正确的缓存是已经潮红了。 – 2011-06-11 10:28:54