Entlib Cache.Contains NULL问题

时间:2009-03-23 13:56:50

标签: caching null enterprise contains

我的后端有一个组合授权和菜单结构系统。 出于性能原因,EntLib缓存用于前端客户端(MVC rel 1.0网站,IIS 5.1本地,IIS 6.0服务器,无群集)。

有时'Cache.Contains'将返回true,但缓存的内容为NULL。我肯定知道我填写正确,所以这里可能出现什么问题?

编辑:当我将缓存设置为1分钟并添加cacheKey'A_Key'时,我会在检查CurrentCacheState时看到密钥返回。当我在2分钟后查看CurrentCacheState时,密钥仍然存在。当我执行'contains'时,返回true。当我再次执行'contains'时,cacheKey消失了! 同步问题??

此致 米歇尔

摘录:

if (IntranetCaching.Cache.Contains(cacheKey))
{
    menuItems = (List<BoMenuItem>)IntranetCaching.Cache[cacheKey];
}
else
{
    using (AuthorizationServiceProxyHelper authorizationServiceProxyHelper = new AuthorizationServiceProxyHelper())
    {
        menuItems = authorizationServiceProxyHelper.Proxy.SelectMenuByUserAndApplication(APPNAME, userName, AuthorizationType.ENUM_LOGIN);
        IntranetCaching.Add(cacheKey, menuItems);
    }
}

和cachehelper:

public static class IntranetCaching
{
    public static ICacheManager Cache { get; private set; }

    static IntranetCaching()
    {
        Cache = CacheFactory.GetCacheManager();
    }

    public static void Add(string key, object value)
    {
        Cache.Add(
            key
            , value
            , CacheItemPriority.Normal
            , null
            , new Microsoft.Practices.EnterpriseLibrary.Caching.Expirations.AbsoluteTime(TimeSpan.FromMinutes(10)));
    }
}

2 个答案:

答案 0 :(得分:1)

感谢迈克尔跟进你自己的问题,我一直坚持这一天,确定如果我尝试从缓存中检索一个项目,这是因为到期(+ 0到25秒)我会得到一个NULL值。 Codeplex已经在他们的FAQ中发布了一种解决方法(

  

一个。在刷新项目时,如何避免从CacheManager获取空值? - 间歇性地,您可能会遇到这种情况。要解决此问题,请创建自己的ICacheItemExpiration实现。在HasExpired()方法中,实现一个逻辑,该逻辑将检查项目是否已过期,并在项目已过期时更新该项目的值。此方法应始终返回false,以使项目不被标记为已过期。由于在HasExpired()方法中返回false,该项目将不会刷新,并将包含方法中实现的更新值。   参考:link

答案 1 :(得分:0)

我收到了Avanade(Entlib的创建者)的以下回复:

  

最有可能的是BackgroundScheduler   还没有完成它的扫地。如果   你要检查来源   代码,Contains方法只检查   如果特定密钥存在于   在内存上的内存缓存哈希表   GetData方法,代码首先检查   如果该项目已过期,如果已过期,   该项目已从缓存中删除。

     

Sarah Urmeneta Global Technology&amp;   解决方案Avanade,Inc。   entlib.support@avanade.com

该解决方案对我有用。 仍然存在的问题仍然是,为什么你可以使用'包含',因为它的结果不能以合理的方式使用。

此致 微米。