Application_End()无法通过HttpContext.Current.Cache [key]访问缓存

时间:2010-12-12 01:37:41

标签: c# asp.net caching httpcontext.cache application-end

我希望能够在应用程序重启之间维护某些对象。

为此,我想在Global.asax Application_End()函数中将特定的缓存项目写入磁盘,然后将其重新加载到Application_Start()上。

我目前有一个缓存助手类,它使用以下方法返回缓存的值:

return HttpContext.Current.Cache[key];

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

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

4 个答案:

答案 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。