ASP.NET кеширование объектов в классе - PullRequest
0 голосов
/ 03 января 2011

Я пытаюсь создать класс кэширования, чтобы кэшировать некоторые объекты со своих страниц. Цель состоит в том, чтобы использовать систему кэширования платформы ASP.NET, но абстрагировать ее от отдельного класса. Кажется, что кеширование не сохраняется.

Есть идеи, что я здесь не так делаю? Можно ли вообще кешировать объект вне самой страницы?

РЕДАКТИРОВАТЬ: добавил код:

Вставить в кеш

Cache c = new Cache();
c.Insert(userid.ToString(), DateTime.Now.AddSeconds(length), null, DateTime.Now.AddSeconds(length), Cache.NoSlidingExpiration,CacheItemPriority.High,null);

Получить из кеша

DateTime expDeath = (DateTime)c.Get(userid.ToString())

Я получаю нулевое значение на c.Get, даже после того, как у меня есть ключ.

Код находится в другом классе, чем сама страница (страница использует его)

Спасибо.

Ответы [ 3 ]

7 голосов
/ 03 января 2011

Существует множество способов хранения объектов в ASP.NET

  1. Элементы уровня страницы -> Свойства / Поля на странице, которые могут жить в течение всего жизненного цикла страницы в запросе.
  2. ViewState -> Хранить элементы в сериализованном формате Base64, который сохраняется через запросы с использованием PostBack.Элементы управления (включая саму страницу - это элемент управления) могут сохранить свое предыдущее состояние, загрузив его из ViewState.Это дает представление о страницах ASP.NET с сохранением состояния.
  3. HttpContext.Items -> Словарь элементов для хранения в течение срока действия запроса.
  4. Сеанс -> Обеспечивает кэширование по нескольким запросам.через сессию.Механизм кэширования сеанса фактически поддерживает несколько различных режимов.
    • InProc - элементы сохраняются текущим процессом, что означает, что в случае завершения или повторного выполнения процесса данные сеанса теряются.
    • SqlServer - элементы сериализуются и сохраняются в базе данных сервера SQL.Элементы должны быть сериализуемыми.
    • StateServer - элементы сериализуются и хранятся в отдельном процессе, процессе StateServer.Как и в случае с SqlServer, элементы должны быть сериализуемыми.
  5. Runtime - элементы, хранящиеся в кэше времени выполнения, останутся на время существования текущего приложения.Если приложение будет переработано / остановлено, элементы будут потеряны.

Какой тип данных вы пытаетесь сохранить, и как вы считаете , что они должны сохраняться?

В самом начале прошлого года я написал сообщение в блоге о фреймворке кэширования, который я писал, что позволяет мне делать такие вещи, как:

// Get the user.
public IUser GetUser(string username)
{
  // Check the cache to find the appropriate user, if the user hasn't been loaded
  // then call GetUserInternal to load the user and store in the cache for future requests.
  return Cache<IUser>.Fetch(username, GetUserInternal);
}

// Get the actual implementation of the user.
private IUser GetUserInternal(string username)
{
  return new User(username);
}

Это было почти год назад,и с тех пор он немного развился, вы можете прочитать об этом в моем блоге , дайте мне знать, если это имеет какое-либо значение.

3 голосов
/ 03 января 2011

Ваша ссылка на кэш должна быть доступна для всех элементов в вашем коде - такая же ссылка .

Если вы обновляете класс Cache каждый раз, вы делаете этонеправильно.

2 голосов
/ 03 января 2011

Я сделал почти то же самое, но с другим кодом (и он работает для меня): (CacheKeys - это перечисление)

using System;
using System.Configuration;
using System.Web;
using System.IO;
    public static void SetCacheValue<T>(CacheKeys key, T value)
    {
        RemoveCacheItem(key);
        HttpRuntime.Cache.Insert(key.ToString(), value, null,
            DateTime.UtcNow.AddYears(1),
            System.Web.Caching.Cache.NoSlidingExpiration);
    }
    public static void SetCacheValue<T>(CacheKeys key, T value, DateTime expiration)
    {
        HttpRuntime.Cache.Insert(key.ToString(), value, null,
            expiration,
            System.Web.Caching.Cache.NoSlidingExpiration);
    }
    public static void SetCacheValue<T>(CacheKeys key, T value, TimeSpan slidingExpiration)
    {
        HttpRuntime.Cache.Insert(key.ToString(), value, null,
            System.Web.Caching.Cache.NoAbsoluteExpiration,
            slidingExpiration);
    }
    public static T GetCacheValue<T>(CacheKeys key)
    {
        try
        {
            T value = (T)HttpRuntime.Cache.Get(key.ToString());

            if (value == null)
                return default(T);
            else
                return value;
        }
        catch (NullReferenceException)
        {
            return default(T);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...