2

我在我的 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分钟。即使我的代码将丢失的条目放回缓存中,后续的缓存 Gets 也会返回 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的地方。

即:如果我设置如下: config.Add("pollingInterval", "00:00:15:00"); 然后一切正常15分钟。

注意:如果我的 WCF 服务由我的开发环境中的 IISExpress 托管,我将无法重现。当我的 WCF 服务由 IIS 7.5 托管时,这似乎也会发生。我在 IIS 7.5 上的应用程序池未回收。

有没有人经历过这样的事情?我看到了以下内容: MemoryCache 不遵守配置中的内存限制

谢谢,

马特

4

1 回答 1

1

我也看到了这个问题,并在这里用一个简单的复制器项目向 MS 提交了一个错误。

MS 在我提交的上述错误中已经解决了这个问题 - 在那里解决了一个问题,即将推出 .net 4 的 QFE 以及确认这在 4.5 中不是问题我还没有尝试解决这个问题

但是,我可以提供更多关于我自己重新创建它所需条件的信息。应用程序池需要处于集成管道模式才能看到此问题 - 经典模式修复了此问题,但消除了迁移到 IIS 7.5 的一些好处。同样,在使用集成模式时,如果我使用内置应用程序池标识(例如ApplicationPoolIdentity ),我也没有看到此问题。但是,我的应用程序需要使用服务帐户作为自定义身份运行,此时我看到了该行为。因此,如果您不需要集成模式或自定义身份,您可以解决这个问题。

也许内置帐户有权进行由 pollingInterval 发起的缓存内存统计收集,而我的自定义身份没有,我不知道。

希望这会有所帮助,甚至其他人可以加入更多的点来找出更好的解决方法。

于 2013-02-20T16:15:52.670 回答