MemoryCache在第一次到期后始终返回“null”

时间:2012-04-20 23:13:40

标签: c# asp.net-mvc iis memorycache

我有以下问题,我有这种缓存管理:

public class CacheManager : ICacheManager {

    private readonly ObjectCache cache;

    public CacheManager() {
        this.cache = MemoryCache.Default;
    }

    public void AddItem(string key, object itemToCache, double duration) {
        var end = DateTime.Now.AddSeconds(duration);
        this.cache.Add(key, itemToCache, end);
    }

    public T Get<T>(string key) where T : class {
        try {
            return (T)this.cache[key];
        }
        catch (Exception ex) {
            return null;
        }
    }

    public void Remove(string key) {
        this.cache.Remove(key);
    }
}

非常简单。

编辑I(问题文本中的错误修复)

问题:当任何密钥的缓存过期时,以下所有调用以获取缓存中的任何对象都将返回“null”。我检查了钥匙,并且总是正确的。

问题仅发生在我PC上的客户端服务器中,而我的服务器运行正常。

感谢。

编辑II(进展)

当我们在客户的服务器中重新启动应用程序池时,您的问题将在几个小时内解决。

我们的网站有一个特定的应用程序池,其中包含以下设置:

Pipeline Manager模式:集成 框架:v4.0 启用32位应用程序:True。

其他设置,例如默认设置。

在服务器上我们有2个站点,其中一个启用了“启用32位应用程序”,如果两个站点都被禁用,则发生错误,但不知道这是否是问题。

编辑III(进展)

由于我们未能解决问题,我们决定切换到Httpcontext.Current.Cache,我们可以解决问题。我们想要另一种解决方案并继续使用MemoryCache,但没有结果。

2 个答案:

答案 0 :(得分:1)

此类缓存通常需要您的代码处于“如果项目不在缓存中然后创建项目,使用已创建的项目并添加到缓存,否则使用缓存中的项目” 。因此,如果项目不在缓存中,通常应该是一个问题。

项目从缓存中消失的常见原因是内存使用率很高。在这种情况下,内存缓存可以在它们添加到缓存时立即逐出项目。对于以32位(x86)运行的应用程序,此行为非常常见,特别是在处理大量请求或大量数据的服务器上。

验证 - 收集内存控制器并处理'位数。请考虑使用MemoryCache.CreateCacheEntryChangeMonitor和相应的事件添加代码以侦听从缓存中删除项目。

答案 1 :(得分:1)

恢复一个旧问题,但我认为这个问题是由于一个只在ASP.NET 4.5中修复的错误,但是对于早期版本有一个修补程序。

请参阅此主题:MemoryCache Empty : Returns null after being set