Entlib Cache.Contains проблема NULL - PullRequest
0 голосов
/ 23 марта 2009

У меня есть комбинированная система авторизации и меню на нашем бэкэнде. Из соображений производительности в клиентском веб-интерфейсе используется кэширование EntLib (веб-сайт MVC rel 1.0, локальный IIS 5.1, сервер IIS 6.0, без кластера).

Иногда Cache.Contains возвращает true, но содержимое кэша равно NULL. Я точно знаю, что заполнил правильно, так в чем тут проблема?

РЕДАКТИРОВАТЬ: когда я установлю кэш на 1 минуту и ​​добавлю cacheKey 'A_Key', я увижу ключ, возвращающийся при проверке CurrentCacheState. Когда я просматриваю CurrentCacheState через 2 минуты, ключ все еще там. Когда я выполняю «содержит», возвращается true. Когда я снова выполню «Содержимое», cacheKey исчезнет! Проблема синхронизации ??

С уважением, Michel

Выдержка:

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

И кешел:

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 ]

1 голос
/ 03 мая 2011

Спасибо Майклу за решение вашей собственной проблемы, я застрял с этим весь день, определяя, что, если я попытаюсь извлечь элемент из кэша, это истекает (+ 0 до 25 секунд), я получу значение NULL , Codeplex опубликовал обходной путь (своего рода) в своем FAQ:

а. Как избежать получения нулевого значения из CacheManager при обновлении элемента? - Периодически вы можете столкнуться с этой ситуацией. Чтобы обойти это, создайте собственную реализацию ICacheItemExpiration. В методе HasExpired () реализуйте логику, которая проверит, истек ли срок действия элемента, и обновит значение элемента, если срок его действия истек. Этот метод должен всегда возвращать false, чтобы элемент не был помечен как просроченный. В результате возврата false в метод HasExpired () элемент не будет обновляться и будет содержать обновленное значение, как реализовано в методе. REF: ссылка

0 голосов
/ 24 марта 2009

Я получил следующий ответ от Аванаде (создателей Entlib):

Скорее всего, BackgroundScheduler еще не выполнил свою работу Если вы собираетесь изучить источник код, метод Contains проверяет только если конкретный ключ присутствует в хэш-таблица кэша памяти в то время как на Метод GetData, код сначала проверяет если предмет истек, если он имеет, элемент удален из кэша.

Сара Урменета Global Technology & Solutions Avanade, Inc. entlib.support@avanade.com

Это решение работает для меня. Тем не менее остается вопрос, почему вы можете использовать «Содержит», если его результат не может быть использован разумным образом.

С уважением, M.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...