Application_End() не может получить доступ к кешу через HttpContext.Current.Cache[ключ]
Я хочу иметь возможность поддерживать определенные объекты между перезапусками приложения.
Для этого я хочу записать определенные кэшированные элементы на диск в Global.asax Application_End()
функционировать и снова загрузить их Application_Start()
,
В настоящее время у меня есть класс помощника кэширования, который использует следующий метод для возврата кэшированного значения:
return HttpContext.Current.Cache[key];
Проблема: во время Application_End()
, HttpContext.Current
является нулевым, поскольку нет веб-запроса (это автоматическая процедура очистки) - поэтому я не могу получить доступ .Cache[]
чтобы получить любой из элементов для сохранения на диск.
Вопрос: как я могу получить доступ к элементам кэша во время Application_End()
?
4 ответа
Если вы хотите получить доступ к объекту кэша до его удаления, вам нужно использовать что-то вроде этого, чтобы добавить объект в кэш:
Импортируйте пространство имен System.Web.Caching в ваше приложение, где вы используете добавление объектов в кеш.
//Add callback method to delegate
var onRemove = new CacheItemRemovedCallback(RemovedCallback);
//Insert object to cache
HttpContext.Current.Cache.Insert("YourKey", YourValue, null, DateTime.Now.AddHours(12), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, onRemove);
И когда этот объект будет утилизирован, будет вызван следующий метод:
private void RemovedCallback(string key, object value, CacheItemRemovedReason reason)
{
//Use your logic here
//After this method cache object will be disposed
}
Вы можете получить доступ к кешу через HttpRuntime.Cache, когда у вас нет доступного HttpContext. Однако в Application_End я считаю, что кэш уже очищен.
Решение, которое наметил Дима Шмидт, было бы лучшим подходом для хранения ваших кэшированных значений. То есть путем добавления ваших элементов в кеш с помощью CacheItemRemovedCallback и сохранения значений на диске там.
Я настоятельно призываю вас пересмотреть свой подход. Вы можете описать особенности того, что вы пытаетесь сделать, поэтому мы можем помочь вам в этом. Но если вы полностью настроены на него, то вы можете просто сохранить значения на диске, когда вы их фактически установите, то есть ваш вспомогательный класс будет выглядеть примерно так:
public static class CacheHelper
{
public static void SetCache(string key, object value)
{
HttpContext.Current.Cache[key] = value;
if (key == "some special key")
WriteValueOnDisk(value);
}
}
В качестве альтернативного решения вы можете сохранить данные в объекте Application (Application[key]) или просто создать static class
и использовать его для хранения ваших данных в приложении - в этом случае данные будут доступны после Application_End.