Application_end () не может получить доступ к кэше через httpcontext.courrent.chece [Key

StackOverflow https://stackoverflow.com/questions/4419981

Вопрос

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

Для этого я хочу написать конкретные кэшированные предметы на диск в 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top