У меня проблема с приложением MVC 3, использующим новую .NET 4 System.Runtime.Caching MemoryCache.Я замечаю, что после, казалось бы, непредсказуемого времени, он прекращает кэширование и действует как пустой.Рассмотрим этот фрагмент кода, который я взял прямо из тестового представления в ASP.NET MVC:
MemoryCache.Default.Set("myname","fred", new CacheItemPolicy() { SlidingExpiration = new TimeSpan(0,5,0) });
Response.Write(MemoryCache.Default["myname"]);
Когда он работает, предсказуемо выводится «fred».Однако, когда проблема начинает возникать, несмотря на Set()
, значение MemoryCache.Default["myname"]
равно нулю.Я могу доказать это, установив точку останова в строке Response.Write()
и непосредственно установив и считав из кеша с помощью Immediate Window - он просто не установит его и останется нулевым!Тогда единственный способ заставить его работать снова - это вызвать перезапуск AppDomain.
Интересно, что я могу спровоцировать возникновение проблемы, когда приложение работает нормально, ломая строку Response.Write()
и выполняя MemoryCache.Default.Dispose()
.После этого MemoryCache.Default сам по себе не равен нулю (почему это так?), Но не будет сохранять ничего установленного на нем.Это не вызывает никаких ошибок, но ничего не спасет.
Кто-нибудь может это проверить и объяснить?Как я полагаю, я обнаружил, что когда приложение перестает работать само по себе, что-то удаляет MemoryCache.Default
, но это не я!
ОБНОВЛЕНИЕ
Ну, мне надоел этот пробник сейчас!CLRProfiler, похоже, не работает с MVC 3. Инструмент SciTech CLR был хорош - так же, как и RedGate ANTS.Но все, что они сказали мне, это то, что объект MemoryCache удаляется с помощью что-то !Я также доказал (с помощью печати временной метки), что PartialView на моей странице, который должен быть кэширован (задан OutputCacheAttribute), перестает кэшироваться через несколько минут - он начинает обновляться при каждом обращении к странице.Просто чтобы прояснить среду, я работаю прямо на сервере IIS 7.5 на моей рабочей станции, на которой работает Win 7 Ultimate.Упомянутые выше инструменты памяти предполагают, что я использую только около 9 МБ памяти с точки зрения объектов в игре.
В отчаянии я изменил свой код кэширования, чтобы сначала искать окружающий HttpContext для подключения и использования его функции кэшированияесли есть.Ранние тесты показали, что это надежно, но похоже на неприятный взлом.
У меня возникает ощущение, что MemoryCache и OutputCache не гарантированы для работы с MVC 3 ...