HTTP ハンドラーの JSON 出力をキャッシュしようとしています (ASP.NET ページではないため、ページレベルの OutputCache ディレクティブは適用されません)。Windows Server 2008 で IIS 7.5 を実行しています。
Web.config に行を追加して、ユーザー モードでのキャッシュを有効にしました (認証が必要なため、カーネル モードではありません)。
<system.webServer>
<caching enabled="true" enableKernelCache="false">
<profiles>
<!-- cache content according to full query string for 12 hours -->
<add varyByQueryString="*" duration="12:00:00" policy="CacheForTimePeriod" extension=".aspx" />
</profiles>
</caching>
<urlCompression dynamicCompressionBeforeCache="true" />
</system.webServer>
<location path="Content">
<system.webServer>
<!-- cache content that's requested twice in 30 minutes -->
<serverRuntime enabled="true" frequentHitThreshold="2" frequentHitTimePeriod="00:30:00" />
</system.webServer>
</location>
コンテンツは正常にキャッシュされますが、60 秒間しか存続しません。60 秒のある種の TTL について、さまざまな構成ファイル (Web.config、applicationHost.config、マシン構成) をすべて調べましたが、途方に暮れています。
キャッシュ スカベンジャーが実行されるたびに私のキャッシュ エントリを食べているのではないかと疑っていました。レジストリ キーを変更して、スカベンジャーの実行頻度を減らしました。それは役に立ちませんでした。
また、マシンが物理 RAM を大量に使用しているため、IIS が過度にキャッシュをクリアしているのではないかと疑っていました。この特定のサーバーには、約 66% の物理 RAM 飽和があります。IIS がキャッシュを管理できるようにするのではなく、静的な量 (1 GB) を出力キャッシュに割り当てようとしましたが、これも失敗しました。
これは、この Stack Overflow ページで尋ねられたのと同じ質問だと思いますが、その人は答えを得ませんでした。
前もって感謝します。
編集:この非常に役立つ記事で説明されているように、OutputCacheTTL および ObjectCacheTTL レジストリ値を変更することで、最終的にこの問題を解決できました。Microsoft のドキュメントはかなり不完全なようです。