2

コードで出力キャッシュをキャンセルできるかどうかは誰にもわかりませんか? つまり、次のように子アクションに出力キャッシュを配置すると、条件に基づいて子アクション内からそのキャッシュをキャンセルできますか?

[ChildActionOnly]
[OutputCache(Duration = 36000, VaryByParam="tagslug")]
public virtual ActionResult MostViewed(string tagslug, int count)
{
    // Make an API call here. If not data returned do not cache the ChildAction as specified above
}
4

1 に答える 1

1

フレームワークのソースをざっと見ると、唯一のロジックは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"))) {

または同様の、またはそのコードをコントローラーからこれにフラグを渡す方法を見つけます。既存のコードは、オブジェクトを使用してセッションに値を格納します。これをコピーできます。

  1. _childActionFilterFinishCallbackKey例と同じように新しい静的オブジェクトキーを定義します_noCacheResultKey
  2. たとえば、呼び出すことができる属性にパブリック静的メソッドを追加します

    public static void FlagNoCache(HttpContext httpContext) {
        httpContext.Items[_noCacheResultKey] = true;
    }
    
  3. コールバックと同様にClearChildActionFilterFinishCallbackこれを削除するために拡張します.Items[]
  4. 上記のテストを拡張して、これもチェックします。

    if (!(wasException
          || filterContext.HttpContext.Items.ContainsKey(_noCacheResultKey))) {
    
  5. MyOutputCacheAttribute.FlagNoCache(Context);必要に応じてコントローラー呼び出しから。

コードから例外をスローし、それを別のコードでキャッチして、それIExceptionFilterを超えないようにすることもできますがOutputCacheAttribute、申し訳ありません。

于 2012-11-29T14:36:29.720 に答える