C # ASP.NET: как получить доступ к кешу, когда HttpContext.Current не доступен (нулевой)? - PullRequest
12 голосов
/ 15 декабря 2010

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

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

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

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

Ответы [ 3 ]

28 голосов
/ 15 декабря 2010

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

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

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

11 голосов
/ 15 декабря 2010

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

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

, который в основном выполняет резервное копирование James Gaunt, но, конечно, только поможетполучить кеш в конце приложения.

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

6 голосов
/ 15 декабря 2010

Внутри события 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
}

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

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

...