Wcf .Net 4.0内存缓存清除
我正在WCF服务中使用.Net 4.0 MemoryCache。 我最初使用的默认缓存如下所示:Wcf .Net 4.0内存缓存清除,wcf,caching,.net-4.0,Wcf,Caching,.net 4.0,我正在WCF服务中使用.Net 4.0 MemoryCache。 我最初使用的默认缓存如下所示: var cache = MemoryCache.Default; var geoCoordinate = cache.Get(cacheKey) as GeoCoordinate; if (geoCoordinate == null) { geoCoordinate = get it from somewhere; cache.Set(cacheKey, geoCoordinate
var cache = MemoryCache.Default;
var geoCoordinate = cache.Get(cacheKey) as GeoCoordinate;
if (geoCoordinate == null)
{
geoCoordinate = get it from somewhere;
cache.Set(cacheKey, geoCoordinate, DateTimeOffset.Now.AddDays(7));
}
然后按照通常的模式,尝试在缓存中查找某些内容,然后
如果未找到,则将其设置到缓存中(代码段/伪代码如下所示):
我发现我的条目在大约2分钟后消失了。即使我的代码将丢失的条目放回缓存,后续的缓存get也会返回null。
我的WCF服务由IIS 7.5托管。如果我回收了应用程序池,所有的东西都会正常工作2分钟,但是上面描述的模式会重复
在做了一些研究之后,我做了以下替换:
var cache=MemoryCache.Default
//使用新代码创建缓存,如下所示:
var config = new NameValueCollection();
//Hack: Set Polling interval to 10 days, so will no clear cache.
config.Add("pollingInterval", "10:00:00:00");
config.Add("physicalMemoryLimitPercentage", "90");
config.Add("cacheMemoryLimitMegabytes", "2000");
//instantiate cache
var cache = new MemoryCache("GeneralCache", config);
似乎无论我将什么放入physicalMemoryLimitPercentage
,或cacheMemoryLimitMegabytes
似乎都没有帮助。但是将pollingInterval
放在一个大的datespan
上就行了
ie:如果我设置如下:
配置添加(“pollingInterval”,“00:00:15:00”);
然后在15分钟内一切正常
注意:如果我的WCF服务由IISExpress在我的开发环境中托管,我将无法复制。
当我的WCF服务由IIS 7.5托管时,似乎也会发生这种情况。
我在IIS 7.5上的应用程序池不可回收
有人经历过这样的事情吗?
我看到了以下几点:
谢谢
Matt我也看到了这个问题,并通过一个简单的复制项目向MS提交了一个bug 在我提交的上述bug中,微软已经解决了这个问题——在这方面做了一些工作,即将推出.NET4的QFE,并确认这在4.5中不是问题 我还没有尝试过这项工作 不过,我可以提供一些关于我自己重新创建此功能所需条件的更多信息。应用程序池需要处于集成管道模式,我才能看到此问题-经典模式修复了此问题,但消除了迁移到IIS 7.5的一些好处。 同样,在使用集成模式时,如果使用了内置的应用程序池标识(如ApplicationPoolIdentity),我也没有看到这个问题。但是,我的应用程序需要使用服务帐户以自定义身份运行,而我正是在这一点上看到了这种行为。因此,如果您不需要集成模式或自定义标识,您可以解决此问题 也许内置帐户有权执行pollingInterval启动的缓存统计数据收集,而我的自定义标识没有,我不知道
希望这有帮助,甚至其他人可以加入更多的点来找出更好的解决方法。MS已经发布了一个解决方法,一个未来的QFE解决方案,关于我提交的错误,并确认这已在.net 4.5中修复