フレームワークのソースをざっと見ると、唯一のロジックはdon't -cache-on-exception のように見えます:
// Only cache output if this wasn't an error
if (!wasException) {
ChildActionCacheInternal.Add(uniqueId, capturedText,
DateTimeOffset.UtcNow.AddSeconds(Duration));
}
これを解決する素晴らしい方法がわかりませんOutputCachingAttribute
。CodePlex の ASP.NET MVC ソースの元のソースに基づいて独自のカスタムを作成し、その行に追加のチェックを追加する必要があると思います。返された出力など
if (!(wasException || capturedText.Contains("results:0"))) {
または同様の、またはそのコードをコントローラーからこれにフラグを渡す方法を見つけます。既存のコードは、オブジェクトを使用してセッションに値を格納します。これをコピーできます。
_childActionFilterFinishCallbackKey
例と同じように新しい静的オブジェクトキーを定義します_noCacheResultKey
たとえば、呼び出すことができる属性にパブリック静的メソッドを追加します
public static void FlagNoCache(HttpContext httpContext) {
httpContext.Items[_noCacheResultKey] = true;
}
- コールバックと同様に
ClearChildActionFilterFinishCallback
これを削除するために拡張します.Items[]
上記のテストを拡張して、これもチェックします。
if (!(wasException
|| filterContext.HttpContext.Items.ContainsKey(_noCacheResultKey))) {
MyOutputCacheAttribute.FlagNoCache(Context);
必要に応じてコントローラー呼び出しから。
コードから例外をスローし、それを別のコードでキャッチして、それIExceptionFilter
を超えないようにすることもできますがOutputCacheAttribute
、申し訳ありません。