web-dev-qa-db-ja.com

asp.net-mvcでのキャッシュ

私のasp.net-mvcサイトで、最もデータベースが重いアクションをキャッシュしたいと思います。私の研究で私は見つけました

しかし、私はまだそれを手に入れたとは感じません。
いくつかのパーに応じて、POSTリクエストをキャッシュできるようにしたい。これらのパーはオブジェクト内にあります。そこで、次のリクエストの結果をキャッシュしたいと思います。

public ActionResult AdvancedSearch(SearchBag searchBag)

SearchBagは、オプションの検索パラメーター(の束)を保持するオブジェクトです。私のビュー自体は(本来あるべき)軽いですが、検索バッグに入力されるフィールドによっては、データアクセスにかなり時間がかかる場合があります。

自分のアクションではなく、データレイヤーにキャッシュする必要があると感じています。
OutputCache属性でVaryByParamを使用するにはどうすればよいですか?

82
Boris Callens

モデルまたはデータレイヤーにもキャッシュするのが好きです。これにより、コントローラー/プレゼンテーションからのデータの取得に関係するすべてが分離されます。 System.Web.HttpContext.Current.CacheからASP.NETキャッシュにアクセスするか、エンタープライズライブラリのキャッシュアプ​​リケーションブロックを使用できます。クエリのパラメーターからキャッシュされたデータのキーを作成します。データを更新するときは、必ずキャッシュを無効にしてください。

74
Matthew

または、HttpContext.Currentから独立して、HttpRuntime.CacheからCacheにアクセスできます:)

66
Andrei Rînea

多くの場合、OutputCachingは最も高速で効率的ですが、要件を満たしている場合に限ります。それが間違っている場合、高速で効率的であることには意味がありません! ;)

この場合、複雑なキャッシングのニーズがあるため、データレイヤーでのキャッシングは正しいようです。キャッシュする出力を制御するパラメーターのセットが単純な場合、2つを組み合わせることができます。

12
Haacked

次のような出力キャッシュを使用できます

[OutputCache(Duration = 10, VaryByParam = "empID")]
      public ActionResult GetEmployeeDetail(int empID)
      {
          Employee e = new Employee();
          return Content(e.getEmployeeDetails(empID));
      }

または、キャッシュプロファイルを使用して、Web設定で設定できます

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Admin" 

        duration="86420" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

and use this tag
[OutputCache(CacheProfile="Admin")]
0
Nikki