Wcf .Net 4.0内存缓存清除

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

我正在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, 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中修复