1

В последнее время я экспериментировал с объектами кэширования с HttpRuntime.Cache, и я был вообще под впечатлением, что, если я «добавил» что-то в кэш, как это:ASP.NET: HttpRuntime.Cache становится красным при сохранении WebConfigurationManager - это ошибка?

HttpRuntime.Cache.Insert("Test", "This is a test!", null, 
    Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, 
    CacheItemPriority.NotRemovable, new CacheItemRemovedCallback(FileChanged)); 

, что «NotRemovable» и «NoExpiration» флаги сохраняли бы объект в памяти на время действия приложения. Но обнаружил, что в конце некоторых запросов страницы HttpRuntime.Cache будет полностью пустым!

Прослеживание и установка точки останова внутри моего обратного вызова «FileChanged» Я мог видеть, что действительно что-то «удаляло» мой объект (и каждый другой объект в кеше), но я не мог понять, почему. Поэтому, в конце концов, я начал отключать другие вещи, которые, как я думал, могут повлиять на эту подсистему.

В конце концов, я закомментировать строки:

WebConfigurationManager.OpenWebConfiguration("~").Save; 

Я был в основном извлечения данных из «web.config» в регионе AppSettings, но время от времени писать обратно AppSettings и сохранения изменений, используя приведенную выше команду , Я знал, что, читая, что «web.config» кэшируется, но сохранение моих изменений обратно не должно очищать все HttpRuntime.Cache, правильно?

Это ошибка? Или два кэша каким-то образом связаны таким образом, что я должен быть осведомлен?

EDIT:

Хорошо, я сделал это супер воспроизводимым, если кто-то хочет попробовать это на своей собственной машине. (Я бегу VS2008 Pro ж/MVC2 таргетинга .NET 3.5) Просто запустите новый проект MVC2 и вставьте следующий код в HomeController над любой уже есть:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Configuration; 
using System.Configuration; 

namespace BackButtonTest.Controllers 
{ 
    [HandleError] 
    public class HomeController : Controller 
    { 
     private string MESSAGE = "Message"; 
     public ActionResult Index() 
     { 
      ViewData[MESSAGE] = HttpRuntime.Cache.Get(MESSAGE); 
      Configuration Config = WebConfigurationManager.OpenWebConfiguration("~"); 
      Config.AppSettings.Settings.Add("SomeKey", "SomeValue"); 
      Config.Save(); 
      return View(); 
     } 

     public ActionResult About() 
     { 
      HttpRuntime.Cache[MESSAGE] = "This is pulled from the HttpRuntime.Cache"; 
      return View(); 
     } 
    } 
} 

Затем выполните следующие действия:

  1. Запуск приложения в режиме отладки.
  2. Нажмите ссылку "О программе". Это загружает строку в кэш.
  3. Нажмите на ссылку «Главная». Строка вытягивается из кэша и застряла в словаре ViewMessage. Некоторая пара ключей/значений записывается в файл web.config и сохраняется. Строка из кеша должна появиться на главной странице.
  4. Нажмите ссылку «Главная» еще раз. Строка должна быть вытащена из кеша, но это не так.
  5. Остановить программу. Прокомментируйте 3 строки, начинающиеся с «Config». Перезагрузите программу.
  6. Повторите шаги с 1 по 4. Обратите внимание, что HttpRuntime.Cache не был опустошен.

Странно, да?

ответ

2

Запись на ваш web.config заставит приложение перезагрузиться, и, скорее всего, события для очистки кеша, в состоянии session-состояния и т. Д. Исчезнут. Попробуйте записать какой-нибудь журнал в global.asax Application_End (или как бы там ни было название метода :))

+1

Wild. Я понятия не имел, что запись в web.config заново запустит приложение. – Pretzel