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.

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