System.Web.Caching.Cache генерирует нулевое исключение в модели

Может быть, этот вопрос должен быть легким, но это не так. Я прочитал проблему с использованием класса System.Web.Caching.Cache в ASP.NET.

У меня есть синглтон-класс:

private System.Web.Caching.Cache _cache;
private static CacheModel _instance = null;

private CacheModel() {
   _cache = new Cache();
}

public static CacheModel Instance {
         get {
            return _instance ?? new CacheModel();
         }
      }

public void SetCache(string key, object value){
   _cache.Insert(key, value);
}

Если где-нибудь еще в моем коде я вызываю следующее:

CacheModel aCache = CacheModel.Instance;
aCache.SetCache("mykey", new string[2]{"Val1", "Val2"});  //this line throws null exception

Почему вторая строка выдает исключение нулевой ссылки?

Может быть, я где-то допустил ошибку в коде?

Спасибо.

2 ответа

Решение

Вы не должны использовать Cache введите для инициализации вашего собственного экземпляра:

Этот API поддерживает инфраструктуру.NET Framework и не предназначен для использования непосредственно из вашего кода.

Не смотря непосредственно на то, почему вы получите исключение нулевой ссылки, я сталкивался с этой проблемой раньше, это связано с инфраструктурой и жизненным циклом веб-приложения:

Один экземпляр этого класса создается для каждого домена приложения и остается действительным, пока домен приложения остается активным. Информация об экземпляре этого класса доступна через свойство Cache объекта HttpContext или свойство Cache объекта Page.

Итог, не используйте System.Web.Caching.Cache введите непосредственно таким способом - либо получите доступ к существующему экземпляру кэша, либо используйте альтернативу, например блок кэширования приложения библиотеки предприятия.

Как Грант отметил выше, System.web.caching.cache хранит внутренние данные ASP.NET (например, пакеты, которые были встроены в App_start).

Вместо этого используйте System.Runtime.Caching. вот пошаговое руководство по MSDN

Вот фрагмент:

using System.Runtime.Caching;

...

ObjectCache cache = MemoryCache.Default;
var test = "hello world";
cache["greeting"] = test;
var greeting = (string)cache["greeting"];

`

В ASP.NET 4 кэширование реализовано с использованием класса ObjectCache. читать больше на MSDN

Другие вопросы по тегам