.NET TIPS [ASP.NET]Webフォーム・ページの一部分を断片的にキャッシングするには?山田 祥寛2004/11/12 |
|
|
「TIPS:[ASP.NET]サイト共通のレイアウト部分を部品化するには?」でも紹介したように、ユーザー・コントロールを利用することで、サイト共通のレイアウト部品を容易に部品化することができる。ユーザー・コントロールを利用するメリットは、ユーザー・コントロール自体の構築の容易さ、セキュリティ面など多岐にわたるが、その中でも忘れてならないのは「フラグメント・キャッシュ」を利用できるという点だ。
「TIPS:[ASP.NET]リクエスト・パラメータごとにページをキャッシングするには?」でも紹介したように、ASP.NETにはさまざまなキャッシング技術が用意されている。その中でも、フラグメント・キャッシュは特徴的なキャッシング技術の1つだ。フラグメント・キャッシュがページ・キャッシュと異なる点は、その名のとおり、ページ全体ではなく、ページの断片(フラグメント)の単位にコンテンツをキャッシュできるという点である。
1つのWebページの中には、多くの要素が詰まっている。その中には、例えばメニューやナビゲートバー、ヘッダ/フッタのように、更新頻度が少ない(または、基本的に更新されない)コンテンツと、最新ニュースやユーザーの書き込みデータなど、頻繁に内容が変更されるコンテンツとが混在している。これを十把ひとからげにページ単位でキャッシュすることは、実は極めて非効率である。しかし、フラグメント・キャッシュを利用することで、こうした状況にも柔軟に対応することができる。
フラグメント・キャッシュは、ユーザー・コントロールの単位に異なるキャッシュ・ルールを設定するための仕組みを提供する。つまり、ヘッダやメニューのような(半)静的なコンテンツについてはキャッシュの有効期限を長くし、よりトランザクショナルなコンテンツについては有効期限を短くする、もしくはキャッシュ自体を無効にする、といった設定が可能になる。
フラグメント・キャッシュの設定方法は簡単だ。ユーザー・コントロールを定義する.ascxファイルで、@OutputCacheディレクティブを指定するだけでよい。例えば、「TIPS:[ASP.NET]サイト共通のレイアウト部品を部品化するには?」で定義したheader_cs.ascx(C#)/header_vb.ascx(VB.NET)でフラグメント・キャッシュを有効にするには、以下の一文を追加すればよい。
|
|
フラグメント・キャッシュを有効にしたユーザー・コントロール(C#:header_cs.ascx) |
この場合には、header_cs.ascxが担当する描画領域に対して「のみ」、120秒間のキャッシュが有効になる。@OutputCacheディレクティブについては、「TIPS:[ASP.NET]リクエスト・パラメータごとにページをキャッシングするには?」が詳しいが、1つだけ注意していただきたいのは、@OutputCahceディレクティブは.aspxファイル/.ascxファイルいずれに記述するかによって、利用できる属性が異なるという点だ。以下に、対応関係をまとめておこう。
属性名 | .aspx | .ascx |
Duration | ◎ | ◎ |
Location | ○ | × |
Shared | × | ○ |
VaryByCustom | ○ | ○ |
VaryByHeader | ○ | × |
VaryByParam | ◎ | ◎※ |
VaryByControl | × | ◎※ |
@OutputCacheディレクティブの属性と.aspx/.ascxとの対応関係 | ||
◎:必須 ○:任意 ×:使用不可 | ||
※VaryByParam属性とVaryByControl属性のいずれか一方が必須。 |
このうち、Shared属性は、フラグメント・キャッシュを複数ページでも共有可能にするかどうかをTrue/False(デフォルトはFalse)で指定するものだ。例えば、サイト共通で同じ表示が期待されるヘッダやメニュー部分にユーザー・コントロールを利用する場合には、Shared属性をTrueに設定しておくことで、サイト全体のパフォーマンスを向上させることができるだろう。
また、VaryByControl属性は、キャッシュを切り替えるためのキーとなるコントロール名(複数指定の場合はセミコロン区切り)を指定する。VaryByControl属性を利用することで、例えば、入れ子で設置したユーザー・コントロールに対して階層的にキャッシュ・ルールを設定することができる。
カテゴリ:Webフォーム 処理対象:キャッシング 使用キーワード:@OutputCacheディレクティブ 関連TIPS:[ASP.NET]サイト共通のレイアウト部分を部品化するには? 関連TIPS:[ASP.NET]リクエスト・パラメータごとにページをキャッシングするには? |
「.NET TIPS」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|