.NET TIPS

[ASP.NET]サイト共通のキャッシュ・ポリシーを設定するには?[2.0のみ、C#、VB]

山田 祥寛
2006/09/29

 「TIPS:[ASP.NET]リクエスト・パラメータごとにページをキャッシングするには?」でも紹介したように、ASP.NETでは、@OutputCacheディレクティブを利用してキャッシュの有効期限やキー項目などのパラメータの指定を行うだけで、ページ・キャッシュ機能を実現できる。キャッシュに当たって特別なコーディングが一切不要であるという意味で、ずいぶんと重宝してきた読者諸兄も多かったかもしれない。

 しかし、ASP.NET 1.xの@OutputCacheディレクティブには課題も残されていた。というのも、ASP.NET 1.xの@OutputCacheディレクティブでは、ページ単位でキャッシュ・ポリシー(規則)を指定する必要があったのだ。

 そもそもキャッシュ・ポリシーがページごとに異なるというケースはまれだ。アプリケーション一律、とはいわないまでも、ページに含まれるコンテンツの種類や更新の頻度などによって、せいぜいキャッシュ・ポリシーはアプリケーション内で2〜3種類に決定するのが一般的であるはずだ。

 にもかかわらず、ポリシーを個々のページで記述するのは煩雑であるし、何より変更があった場合に、関係するすべてのページをいちいち修正しなければならないというのは、アプリケーションの保守性という観点からも好ましくない。修正漏れやつまらないバグが混入する原因にもなるだろう。

 そこでASP.NET 2.0では、キャッシュ・ポリシーをアプリケーション構成ファイル(Web.config)で管理できるようになった。キャッシュ・ポリシーを定義するには、例えば、以下のように記述すればよい。

<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  <system.web>
    ……中略……
    <caching>
      <outputCacheSettings>
        <add name="MyCache" enabled="true"
         duration="120" varyByParam="*"  />
      </outputCacheSettings>
    </caching>
    ……中略……
  </system.web>
</configuration>
キャッシュ・ポリシーを定義するアプリケーション構成ファイル(Web.config)

 キャッシュ・ポリシーを定義するのは、<caching>/<outputCacheSettings>/<add>要素の役割だ。name属性には、ポリシーを一意に識別する任意の名前を指定する必要がある。そのほか、<add>要素で指定可能な属性は、以下のとおりだ。

属性 概要
enabled キャッシュを有効にするか
duration キャッシュの有効期限(秒)
location キャッシュ・データの格納先
設定値 格納先
Any クライアント、プロキシ・サーバ、アプリケーション・サーバのいずれか(デフォルト)
Server アプリケーション・サーバ
ServerAndClient クライアント、または、アプリケーション・サーバ
Downstream クライアント、または、プロキシ・サーバ
Client クライアント
None キャッシングしない
sqlDependency データベース・キャッシングの依存キー(詳細は「TIPS:[ASP.NET]データベース更新のタイミングでキャッシュを破棄するには?」で解説している)
varyByControl キャッシュ・データを切り替えるためのコントロールID
varyByCustom キャッシュ・データを切り替えるための任意のキー
varyByHeader キャッシュ・データを切り替えるためのHTTPヘッダ名
varyByParam キャッシュ・データを切り替えるためのリクエスト・パラメータ名(パラメータによる区別をしない場合は“none”、すべてのパラメータを切り替えのキーにしたい場合には“*”を指定することも可能)
noStore 「Cache-Control: no-store」ヘッダを送信するか
<add>要素で指定可能な主な属性

 このように定義されたキャッシュ・ポリシー“MyCache”をWebフォームに適用するには、@OutputCacheディレクティブで以下のように記述すればよい。

<%@ OutputCache CacheProfile="MyCache" %>

 これで、キャッシュ・ポリシーに変更があった場合にも(個別のページではなく)アプリケーション構成ファイルの定義だけを修正すればよいので、ポリシー変更が発生した場合にも容易に対応が可能になる。

 最後に、<caching>要素配下で利用可能な子要素とその主な属性をまとめておく。

要素 属性 概要 デフォルト
<cache> disableMemoryCollection メモリ圧迫時に発生するキャッシュのメモリ収集を無効にするか false
disableExpiration キャッシュの有効期限を無効にするか false
privateBytesLimit 有効期限切れキャッシュのクリア処理を行うまでの、アプリケーションのプライベート・メモリの上限 0(自動判定)
percentagePhysicalMemoryUsedLimit 有効期限切れキャッシュのクリア処理を行うまでの、物理メモリの最大パーセンテージ 90
privateBytesPollTime プライベート・メモリの消費を監視するポーリング間隔 00:02:00
<outputCache> enableOutputCache ページの出力キャッシュを有効にするか true
enableFragmentCache フラグメント・キャッシュを有効にするか true
sendCacheControlHeader 「cache-control:private」ヘッダを送信するか true
omitVaryStar 「HTTP Vary: *」ヘッダを送信するか false
<caching>要素配下の主な子要素と属性

 これらの<caching>要素配下の子要素を指定することで、キャッシュにかかわるさまざまなパラメータを規定することが可能だ。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Webフォーム 処理対象:キャッシュ
使用キーワード:@OutputCacheディレクティブ
使用キーワード:<add>要素
関連TIPS:[ASP.NET]リクエスト・パラメータごとにページをキャッシングするには?
関連TIPS:[ASP.NET]データベース更新のタイミングでキャッシュを破棄するには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET]リクエスト・パラメータごとにページをキャッシングするには?
[ASP.NET]ページ内の一部分だけをキャッシュから除外するには?
[ASP.NET]Webフォーム・ページの一部分を断片的にキャッシングするには?
[ASP.NET]サイト共通のレイアウト部分を部品化するには?
[ASP.NET]キャッシュ破棄のタイミングを指定するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間