4

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

为此,我想在 Global.asaxApplication_End()函数中将特定的缓存项写入磁盘,然后将它们重新加载到Application_Start().

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

return HttpContext.Current.Cache[key];

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

问题:我如何访问缓存中的项目Application_End()

4

4 回答 4

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
}
于 2010-12-12T16:57:35.550 回答
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);
    }
}
于 2010-12-12T02:43:13.180 回答
1

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

Dima Shmidt 概述的解决方案将是存储缓存值的最佳方法。即通过使用 CacheItemRemovedCallback 将您的项目添加到缓存,并将值存储到那里的磁盘。

于 2011-01-05T14:49:58.727 回答
0

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

于 2010-12-12T02:52:58.547 回答