Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序_End()无法通过HttpContext.Current.cache[key]访问缓存_C#_Asp.net_Caching_Httpcontext.cache_Application End - Fatal编程技术网

C# 应用程序_End()无法通过HttpContext.Current.cache[key]访问缓存

C# 应用程序_End()无法通过HttpContext.Current.cache[key]访问缓存,c#,asp.net,caching,httpcontext.cache,application-end,C#,Asp.net,Caching,Httpcontext.cache,Application End,我希望能够在应用程序重启之间维护某些对象 为此,我想在Global.asaxApplication\u End()函数中将特定的缓存项写入磁盘,然后将它们重新加载回Application\u Start() 我目前有一个cache helper类,它使用以下方法返回缓存值: return HttpContext.Current.Cache[key]; 问题:在应用程序_End()期间,HttpContext.Current为空,因为没有web请求(这是一个自动清理过程)-因此,我无法访问.Ca

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

为此,我想在Global.asax
Application\u End()
函数中将特定的缓存项写入磁盘,然后将它们重新加载回
Application\u Start()

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

return HttpContext.Current.Cache[key];
问题:在
应用程序_End()
期间,
HttpContext.Current
为空,因为没有web请求(这是一个自动清理过程)-因此,我无法访问
.Cache[]
以检索任何要保存到磁盘的项目


问题:如何在
应用程序_End()
期间访问缓存项?

我强烈建议您重新考虑您的方法。你可能想描述你想做什么的细节,所以我们可能会帮助你。 但是,如果您完全设置了它,那么您可以在实际设置值时将值保存在磁盘上,即,您的帮助器类将如下所示:

public static class CacheHelper
{
    public static void SetCache(string key, object value)
    {
        HttpContext.Current.Cache[key] = value;
        if (key == "some special key")
            WriteValueOnDisk(value);
    }
}

作为替代解决方案,您可以将数据存储在应用程序对象(应用程序[键])中,或者只需创建一个
静态类
,并使用它将数据保存在应用程序中-在这种情况下,数据将在应用程序结束时可用。

如果您希望在释放缓存对象之前访问它,您需要使用类似这样的方法将对象添加到缓存:

将命名空间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
}

当您没有可用的HttpContext时,可以通过HttpRuntime.cache访问缓存。然而,在应用程序端,我相信缓存已经刷新了


Dima Shmidt大纲解决方案将是存储缓存值的最佳方法。也就是说,使用CacheItemRemovedCallback将项目添加到缓存中,并将值存储到磁盘。

应用程序执行大量“脏”写入/更新(站点运行状况、遥测等),而更新太频繁,无法始终将其写入磁盘。只是想在应用程序重启之间保留它们。谢谢,Denis-数据数组可能太大了-还有其他方法访问缓存吗?问题是它不可用,因为没有请求-但缓存必须至少在某种程度上仍然可以访问?好的,另一个建议是在向缓存添加项目时提供CacheItemRemovedCallback()-回调中提供的方法在应用程序结束之前自动触发。。除非你在应用程序中的其他地方手动清除缓存,否则效果很好。既然缓存在你的应用程序中扮演着重要角色,为什么不利用AppFabric缓存/Velocity()。。我认为它会在重启之间自动保留缓存,并提供更多好处。如果您使用的是静态类,那么您还应该关心锁