2012-04-16 8 views
6

ASP.NET MVC 3とAppFabricを分散キャッシュソリューションとして使用して、かなり大きなサイトビルドを実行しています。 AppFabricクラスターを使用するカスタムOutputCacheAdapterを実装しました。ASP.NET MVCはすべてのアクションで出力キャッシュにヒットします

ASP.NETが@OutputCacheAttributeで装飾されていない場合でも、ASP.NETはすべてのアクションに対してOutputCacheProvider.Get()メソッドを呼び出していることがわかりました。

デフォルトのoutputcacheproviderを使用すると問題はほとんどありませんが、別のマシンにあるoutputcacheproviderを実行しているときは問題ありません。

答えて

4

出力キャッシュが最初にキャッシュされたページのコピーをチェックするように設計されています。キャッシュされたコピーがある場合は、それが返され、それ以上は実行されません。特に、コントローラはなく、コントローラのアクションは導出、検査、または実行されません。これは、ページがキャッシュされていない場合にのみ発生します。

キャッシュプロバイダを変更して、ページがキャッシュされる可能性があるかどうかを迅速に判断できるようにする必要があります。キャッシュ可能なページの場合にのみ、分散キャッシュをチェックしてください。このチェックは、リクエスト処理のこの部分では利用できないため、OutputCacheAttributeに基づいて行うことはできません。クイックチェックは、URL、Cookie、およびその他のHTMLヘッダー情報で行う必要があります。

+0

これは良い説明のようです。パフォーマンスのペナルティを受け入れるか、デフォルトのOutputCacheProviderに戻るか、URLの黒または白のリストのようなものを提供してください。 – TheNameless

+1

@TheNameless私は自分でそれをやったことはありませんが、ルートパラメータ[何らかの形で](http://www.scottschluer.com/creating-a-routedata-instance-from-a-url/)を手に入れることはできません。反射を使用してコントローラ/アクションの属性を調べますか?これは理想的ではありませんが、ネットワークのラウンドトリップよりもまだ高速です。 – Basic

0

出力キャッシュキーのプレフィックスを定義できるDonut Cache outputcache属性を使用できます。したがって、カスタムプロバイダでは、キャッシュキーが独自の接頭辞で始まる場合にキャッシュを取得/設定するだけです。

関連する問題