2010-12-12 2 views
4

Я хочу иметь возможность поддерживать определенные объекты между перезапусками приложений.Application_End() не может получить доступ к кешу через HttpContext.Current.Cache [key]

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

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

return HttpContext.Current.Cache[key]; 

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

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

ответ

3

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

Импорт пространства имен 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 
} 
+0

** полезно ** возможно: http://johnnycoder.com/blog/2008/12/10/c-cache-helper-class/ –

1

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

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

Приложение выполняет тонну «грязной» записи/обновления (здоровье сайта, телеметрия и т. Д.) И т. Д. - и обновления происходят слишком часто, чтобы записывать их на диск все время. Просто хочу сохранить их между перезапусками приложений. –

0

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

+0

Спасибо, Денис - массивы данных могут быть слишком большими - есть ли другой способ доступа к кешу? Проблема в том, что он недоступен, потому что запроса нет - но кеш должен быть хотя бы каким-то образом доступным? –

+0

Ну, еще одно предложение - предоставить CacheItemRemovedCallback (http://msdn.microsoft.com/en-us/library/system.web.caching.cacheitemremovedcallback.aspx) при добавлении элементов в кеш - метод, указанный в обратном вызове автоматически запускается прямо до конца приложения. Хорошо работает, если вы вручную не очистите кеш в другом месте приложения. –

+0

Поскольку кеш играет большую роль в вашем приложении - почему бы не воспользоваться использованием AppFabric Caching/Velocity (http://www.hanselman.com/blog/InstallingConfiguringAndUsingWindowsServerAppFabricAndTheVelocityMemoryCacheIn10Minutes.aspx) .. Я думаю, что он автоматически сохраняет кеш между перезапуск плюс дает еще много преимуществ. –

1

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

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

+0

Это правильный кеш уже покраснел. –