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

为此,我想在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时可用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top