我对使用新的 .NET 4 System.Runtime.Caching MemoryCache 的 MVC 3 应用程序有疑问。我注意到,在看似不可预测的时间之后,它会停止缓存内容,并且表现得好像它是空的。考虑一下我直接从 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()
- 它只是不会设置它并保持为空!让它再次工作的唯一方法是导致 AppDomain 回收。
有趣的是,当应用程序正常工作时,我可以通过断线Response.Write()
并运行来引发问题MemoryCache.Default.Dispose()
。之后, MemoryCache.Default 本身不是 null (为什么会这样?),但不会保存任何设置。它不会导致任何错误,但不会保存任何内容。
任何人都可以验证并解释吗?正如我相信我已经发现的那样,当应用程序停止自行运行时,有些东西正在处理MemoryCache.Default
,但不是我!
更新
好吧,我现在厌倦了这个问题!CLRProfiler 似乎不适用于 MVC 3。SciTech 的 CLR 工具很好 - RedGate ANTS 也是如此。但是他们告诉我的只是 MemoryCache 对象正在被某些东西处理!我还证明(通过时间戳打印)我页面上应该缓存的 PartialView(由 OutputCacheAttribute 指定)在几分钟后停止缓存 - 每次调用页面时都会开始刷新。只是为了澄清环境,我直接在运行 Win 7 Ultimate 的开发工作站上的 IIS 7.5 服务器上运行。上面提到的内存工具表明我只使用了大约 9mb 的内存来播放对象。
绝望中,我将缓存代码更改为首先搜索环境 HttpContext 以连接并使用其缓存功能(如果可用)。早期的测试表明这是可靠的,但感觉就像一个讨厌的黑客。
我感觉 MemoryCache 和 OutputCache 不能与 MVC 3 一起使用...