Caching Entlib缓存。包含空值问题

Caching Entlib缓存。包含空值问题,caching,null,enterprise,contains,Caching,Null,Enterprise,Contains,我在后端有一个组合授权和菜单结构系统。 出于性能原因,前端客户端(MVC rel 1.0网站、IIS 5.1本地、IIS 6.0服务器、无群集)中使用EntLib缓存 有时“Cache.Contains”将返回true,但缓存的内容为NULL。我肯定我填对了,那么这里会有什么问题呢 编辑:当我将缓存设置为1分钟并添加cacheKey“A_Key”时,我将在检查CurrentCacheState时看到该键返回。当我在2分钟后查看CurrentCacheState时,密钥仍然存在。当我执行“cont

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

有时“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);
    }
}

我从Avanade(Entlib的创建者)那里得到了以下回应:

最有可能的是背景 还没打扫呢。如果 你要检查来源 代码中,该方法仅包含检查 如果特定密钥存在于 运行时的inmemory缓存哈希表 GetData方法,代码首先检查 如果项目已过期,如果已过期, 该项将从缓存中删除

Sarah Urmeneta全球科技公司& 解决方案Avanade公司。 entlib。support@avanade.com

这个解决方案对我有效。 但问题仍然是,当其结果不能以合理的方式使用时,为什么可以使用“Contains”

问候,,
M.

感谢Michael关注您自己的问题,我整天都在关注这个问题,如果我尝试从缓存中检索一个项目,它将过期(+0到25秒),我将得到一个空值。Codeplex发布了一个解决方案(各种各样),正如他们的常见问题解答中所示:

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

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)));
    }
}