2010-12-15 1 views
9

Во время Application_End() в Global.aspx, HttpContext.Current равно null. Я все еще хочу иметь доступ к кешу - он находится в памяти, поэтому хочу посмотреть, могу ли я ссылаться на него как-то, чтобы сохранить бит на диск.C# ASP.NET: как получить доступ к кешу, если нет HttpContext.Current (равно null)?

Вопрос - есть ли способ ссылаться на кеш в памяти как-то, когда HttpContext.Current равен нулю?

Возможно, я мог бы создать глобальную статическую переменную, которая хранит указатель на кеш, который я мог бы обновлять по HTTP-запросам (псевдо: "static <pointer X>" = HttpRequest.Current) и получать ссылку на кеш через этот указатель в Application_End()?

Есть ли лучший способ получить доступ к кешу в памяти при отсутствии запроса Http?

ответ

4

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

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

Пожалуйста, дайте мне знать, если этот подход не подходит для вас. Надеюсь, это поможет вам с вашим вопросом.

С уважением, Dima.

24

Вы должны быть в состоянии получить доступ к нему через HttpRuntime.Cache

http://www.hanselman.com/blog/UsingTheASPNETCacheOutsideOfASPNET.aspx

Согласно Скотту - глядя на отражатель HttpContext.Current.Cache просто вызывает HttpRuntime.Cache - так что вы можете также получить доступ к нему всегда сюда.

9

Я использую следующий getter, чтобы вернуть объект System.Web.Caching.Cache, который работает для меня.

get 
{ 
    return (System.Web.HttpContext.Current == null) 
     ? System.Web.HttpRuntime.Cache 
     : System.Web.HttpContext.Current.Cache; 
} 

Который в основном поддерживает Джеймс Гонт, но, конечно, только собирается, чтобы помочь получить кэш приложений End.

Редактировать: Я, вероятно, получил это от одного из комментариев к блогу Скотта Хансельмана, с которым связан Джеймс Джеймс!