У меня проблема с приложением 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"]
равно null. Я могу это доказать, установив точку останова на строке Response.Write()
и непосредственно установив и прочитав из кеша, используя окно Immediate - оно просто не установит его и останется нулевым! Единственный способ заставить его снова работать, - это вызвать утилиту AppDomain.
Интригующе я могу спровоцировать возникшую проблему, когда приложение работает нормально, разбившись на строку Response.Write()
и запустив MemoryCache.Default.Dispose()
. После этого MemoryCache.Default не является нулевым (почему это?), Но не сохранит ничего, установленного на нем. Это не вызывает никаких ошибок, но ничего не спасет.
Кто-нибудь может это подтвердить и объяснить? Как я полагаю, я обнаружил, что когда приложение перестает работать самостоятельно, что-то есть Disposing MemoryCache.Default
, но это не я!
UPDATE
Ну, мне сейчас надоело эта проблема! CLRProfiler, похоже, не работает с MVC 3. Инструмент SciTech CLR был хорош - так был RedGate ANTS. Но все, что они сказали мне, это то, что объект MemoryCache устраивает что-то! Я также доказал (через печать временной метки), что PartialView на моей странице, который должен быть кэширован (указанный OutputCacheAttribute), перестает быть кешированным через несколько минут - он начинает обновляться при каждом вызове страницы. Чтобы уточнить среду, я запускаю непосредственно на сервере IIS 7.5 на моей рабочей станции разработки под управлением Win 7 Ultimate. Упомянутые выше средства памяти предполагают, что я использую только около 9 МБ памяти с точки зрения объектов в игре.
В отчаянии я изменил свой код кеширования, чтобы сначала найти окружающий HttpContext, чтобы подключиться к нему и использовать его функции кэширования, если он доступен. Ранние тесты показывают, что это надежно, но это похоже на неприятный взлом.
У меня возникает ощущение, что MemoryCache и OutputCache не гарантируют работу с MVC 3...