0

/Foo/Bar などのアクションがあり、このアクションで GET パラメータを使用して get_cached とします。これは、キャッシュされた値または「リアルタイム」を取得するかどうかを定義します。

これは、次のコードで作成されます。

public ActionResult Bar()
{
    var useCache = Request.Params["get_cached"] == "1" ? true : false;

    if (useCache)
    {
        return RedirectToAction("BarCached");
    }
    else
    {
        return RedirectToAction("BarRealTime");
    }
}

[OutputCache(Duration = 100, VaryByParam = "*")]
public ActionResult BarCached()
{
    return Content("mystuff_cached");
}
public ActionResult BarRealTime()
{
    return Content("mystuff_realtime");
}

URL がBarCachedまたはBarRealTimeとして表示され、Bar (メイン アクション名) のみが取得されることを除けば、このコードに問題はありません。

RedirectToAction を次のような完全なメソッド名に変更しようとしました:

return this.BarCached()

しかし、これはキャッシュ機能を無効にします!

では、このメソッド (BarCached の OutputCache) で OutputCache 定義を使用して、メソッドから ActionResult コードをレンダリングする (Bar から BarCached をレンダリングする) にはどうすればよいでしょうか?

事前に感謝します。

4

2 に答える 2

1

asp.netパイプラインでは、ResolveRequestCache(OutputCacheが依存する)は、要求が認証された直後に発生します。this.BarCached()上記の例では、「Bar」に到達するまでに、キャッシュ属性を認識しないと言って指摘したように、出力キャッシュを使用するには遅すぎます。

問題が生成されるもののパフォーマンスである場合"mystuff_"、その呼び出しの結果をアプリケーションキャッシュに保存して、オブジェクトBar()ではなくメソッドに返すことはできませんか?RedirectToAction

私が知っている解決策はあまりありませんが、うまくいけば同じように役立ちます。

于 2013-02-12T18:57:58.323 に答える
0

System.Web.Cachingasp.netMVCのベースキャッシュハンドラーである名前空間の使用を終了しました。Asp.NETMVCのキャッシュリポジトリにアクセスできますSystem.Web.HttpContext.Current.Cache

それを使用して、「BarCached」のActionResultを保存し、次のようなものを使用して、キャッシュ機能を希望どおりに取得できます。

キャッシュに値を追加します

System.Web.HttpContext.Current.Cache.Insert(
                    "mykey",
                    "myvalue",
                    null,
                    DateTime.Now.AddSeconds(expirationInSeconds),
                    System.Web.Caching.Cache.NoSlidingExpiration
                );

そして、キャッシュから価値を得る

var myvalue = System.Web.HttpContext.Current.Cache.Get("mykey")
于 2013-02-13T13:23:17.660 に答える