0

I have a combined authorization and menustructure system on our backend. For performance reasons EntLib caching is used in the frontend client (MVC rel 1.0 website, IIS 5.1 local, IIS 6.0 server, no cluster).

Sometimes 'Cache.Contains' will return true, but the contents of the cache is NULL. I know for certain that I filled it correctly, so what can be the problem here?

EDIT: when I set the cache to 1 minute and add the cacheKey 'A_Key', I will see the key coming back when inspecting the CurrentCacheState. When I view CurrentCacheState after 2 minutes, the key is still there. When I execute 'contains', true is returned. When I execute 'contains' again, the cacheKey is gone! Synchronization problem??

Regards, Michel

Excerpt:

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

And the 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)));
    }
}
4

2 回答 2

1

感谢迈克尔跟进您自己的问题,我整天都在坚持这一点,我发现如果我尝试从缓存中检索一个项目,这将到期(+ 0 到 25 秒)我将得到一个 NULL 值。Codeplex 在其常见问题解答中发布了一种解决方法(各种):

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

于 2011-05-03T07:46:05.477 回答
0

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

很可能,BackgroundScheduler 还没有执行它的扫描。如果您要检查源代码, Contains 方法仅检查特定键是否存在于内存缓存哈希表中,而在 GetData 方法上,代码首先检查项目是否已过期,如果已过期,则该项目是从缓存中删除。

Sarah Urmeneta 全球技术与解决方案 Avanade, Inc. entlib.support@avanade.com

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

问候,M。

于 2009-03-24T08:43:31.200 回答