新しい .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()
行にブレークポイントを設定し、イミディエイト ウィンドウを使用してキャッシュを直接設定して読み取ることで、これを証明できます。設定されず、null のままです。それを再び機能させる唯一の方法は、AppDomain のリサイクルを引き起こすことです。
興味深いことに、アプリが正常に動作しているときに、Response.Write()
回線を中断して実行すると、問題が発生する可能性がありますMemoryCache.Default.Dispose()
。その後、MemoryCache.Default 自体は null ではありませんが (これはなぜでしょうか?)、設定されたものは保存されません。エラーは発生しませんが、何も保存されません。
誰でもこれを確認して説明できますか? 私が発見したと信じているように、アプリが単独で動作しなくなると、何かが DisposingMemoryCache.Default
になりますが、それは私ではありません!
アップデート
さて、私は今、この問題にうんざりしています! CLRProfiler は MVC 3 では動作しないようです。SciTech の CLR ツールは優れていましたが、RedGate ANTS も同様でした。しかし、彼らが私に言ったのは、MemoryCache オブジェクトが何かによって破棄されているということだけでした。また、(OutputCacheAttribute で指定された) キャッシュする必要がある私のページの PartialView が数分後にキャッシュを停止することを (タイムスタンプの印刷を介して) 証明しました。ページへの呼び出しごとに更新が開始されます。環境を明確にするために、Win 7 Ultimate を実行している開発ワークステーションの IIS 7.5 サーバーで直接実行しています。上記のメモリ ツールは、プレイ中のオブジェクトに関して、約 9 MB のメモリしか使用していないことを示唆しています。
必死になって、キャッシングコードを変更して、最初にアンビエント HttpContext を検索してフックし、そのキャッシング機能が利用可能な場合はそれを使用しました。初期のテストはこれが信頼できることを示していますが、厄介なハックのように感じます.
MemoryCache と OutputCache は MVC 3 での動作が保証されていないと感じています...