Application_End () не может получить доступ к кешу через HttpContext.Current.Cache [ключ] - PullRequest
4 голосов
/ 12 декабря 2010

Я хочу иметь возможность поддерживать определенные объекты между перезапусками приложения.

Для этого я хочу записать определенные кэшированные элементы на диск в функции Global.asax Application_End() и повторно загрузить их обратно на Application_Start().

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

return HttpContext.Current.Cache[key];

Проблема : во время Application_End(), HttpContext.Current равно нулю, так как нет веб-запроса (этоавтоматическая процедура очистки) - поэтому я не могу получить доступ к .Cache[] для извлечения каких-либо элементов для сохранения на диск.

Вопрос : как я могу получить доступ к элементам кэша во время Application_End()?

Ответы [ 4 ]

3 голосов
/ 12 декабря 2010

Если вы хотите получить доступ к объекту кэша до его удаления, вам нужно использовать что-то вроде этого для добавления объекта в кэш:

Импортировать пространство имен 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
}
1 голос
/ 05 января 2011

Вы можете получить доступ к кешу через HttpRuntime.Cache, если у вас нет доступного HttpContext. Однако в Application_End я считаю, что кеш уже очищен.

Решение, которое наметил Дима Шмидт, было бы лучшим подходом для хранения ваших кэшированных значений. То есть путем добавления ваших элементов в кэш с помощью CacheItemRemovedCallback и сохранения значений на диске там.

1 голос
/ 12 декабря 2010

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

public static class CacheHelper
{
    public static void SetCache(string key, object value)
    {
        HttpContext.Current.Cache[key] = value;
        if (key == "some special key")
            WriteValueOnDisk(value);
    }
}
0 голосов
/ 12 декабря 2010

В качестве альтернативного решения вы можете сохранить данные в объекте Application (Application [ключ]) или просто создать static class и использовать его для хранения ваших данных в приложении - в этом случае данные будут доступны после Application_End.

...