Application_end () не может получить доступ к кэше через httpcontext.courrent.chece [Key
-
08-10-2019 - |
Вопрос
Я хочу иметь возможность поддерживать определенные объекты между перезагрузками приложения.
Для этого я хочу написать конкретные кэшированные предметы на диск в Global.Asax Application_End()
функция и перезагрузить их обратно на Application_Start()
.
В настоящее время у меня есть класс помощника кэша, который использует следующий метод для возврата кэшированного значения:
return HttpContext.Current.Cache[key];
Проблема: в течение Application_End()
, HttpContext.Current
NULL, так как веб-запрос нет (это автоматическая процедура очистки) - поэтому я не могу получить доступ .Cache[]
Чтобы получить любой из элементов, чтобы сохранить на диск.
Вопрос: Как я могу получить доступ к элементам кэша во время Application_End()
?
Решение
Если вы хотите получить доступ к объекту Cache, прежде чем он будет располагаться, вам необходимо использовать SomeTink, как это, чтобы добавить объект в кэш:
Импортировать System System.Waching к вашему приложению, где вы используете добавление объектов в кэш.
//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
}
Другие советы
Я настоятельно призываю вас переосмыслить ваш подход. Вы можете описать особенности того, что вы пытаетесь сделать, поэтому мы могли бы помочь вам с этим. Но если вы полностью установите его, вы можете просто сохранить значения на диске, когда вы на самом деле устанавливаете их, то есть ваш класс HELPER будет выглядеть что-то подобное:
public static class CacheHelper
{
public static void SetCache(string key, object value)
{
HttpContext.Current.Cache[key] = value;
if (key == "some special key")
WriteValueOnDisk(value);
}
}
Вы можете получить доступ к кэше через httpruntime.cache, когда у вас нет доступных httpcontext. Однако в Application_end я считаю, что кеш уже промытый.
Решение Dima Shmidt Courtriss будет лучшим подходом для хранения ваших кэшированных значений. Это путем добавления ваших предметов к кэше с помощью CACHITEMREMOVEDCALLBACK и храните значения на диске.
В качестве альтернативного решения вы можете хранить данные в объекте приложения (приложение [KEY]) или просто создать static class
И используйте его, чтобы сохранить ваши данные в приложении - в этом случае данные будут доступны при Application_end.