HttpCacheability.Private Не работает должным образом - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть небольшие объекты данных, которые мне нужно кэшировать на клиенте. Это информация пользователя, такая как его имя и роль. У меня есть набор HttpCacheability.Private. Когда я использую Fiddler для просмотра страницы, я вижу, что кэширование является приватным, но вместо хранения кэша для каждого пользователя, когда другой пользователь переходит на сайт, он отображает кэшированные значения для пользователя, который вошел в систему первым. Мне кажется, что он хранит значение сервера.

Например, срок действия кэша истекает через 10 минут. После истечения срока действия кеша я захожу на сайт. Кеш нулевой, поэтому он ищет информацию о моем пользователе из базы данных (на основе данных текущего пользователя) и записывает ее в кеш. Теперь Джон Доу заходит на сайт через 3 минуты после того, как я это делаю, и он видит мою информацию вместо своей.

Я не уверен, что еще мне нужно сделать, чтобы кэшировать информацию каждого пользователя на своем клиенте, а не на сервере. Любая помощь будет оценена.

Спасибо

Рхонда

public static void AddUserToCache(User userToCache, string Key)
    {
        HttpContext context = HttpContext.Current;
        HttpCachePolicy cachePolicy = context.Response.Cache;
        cachePolicy.SetCacheability(HttpCacheability.Private);

        if (context.Cache[Key] == null)
        {
            context.Cache.Add(Key, userToCache, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(UIConstants.CACHETIMEOUTHOURS, 0, 0), System.Web.Caching.CacheItemPriority.Default, null);
        }
    }




if (Cache["User"] == null)
        {
            user = BusinessUtility.GetCurrentUser();
            if (user != null)
            {
                CacheUtility.AddUserToCache(user, "User");

            }

        }
        else
        {
            user = (User)Cache["User"];
        }

1 Ответ

0 голосов
/ 29 февраля 2012

context.Cache - это кэш на стороне сервера, и там хранятся эти данные.Нет способа изменить это.Хранящиеся там данные будут доступны только через код на стороне сервера.

С другой стороны, context.Response.Cache - это директива, передаваемая в виде заголовков http, которая сообщает браузеру и промежуточным прокси-серверам, следует ли кэшироватьответ от сервера браузеру.

Итак, следующий шаг - немного больше узнать о том, чего вы пытаетесь достичь, кэшируя данные.Вы пытаетесь уменьшить количество обращений с веб-сервера к базе данных или уменьшить количество обращений к веб-серверу в целом?

Если вы пытаетесь уменьшить число обращений к БД, придерживайтесь кода context.Cache, измените его так, чтобы ключимеет некоторый уникальный идентификатор того, какого пользователя вы храните / извлекаете.Избавьтесь от cachePolicy.SetCacheability для начала, чтобы это не смущало вещи.

Если вы пытаетесь сократить число обращений к веб-серверу, придерживайтесь кода cachePolicy.SetCacheability и избавьтесь от context.Cacheкод на данный момент.

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