.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)でフラグメント・キャッシュを有効にするには、以下の一文を追加すればよい。

<%@ Control Language="C#" %>
<%@ OutputCache Duration="120" VaryByParam="id" Shared="True" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
フラグメント・キャッシュを有効にしたユーザー・コントロール(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属性を利用することで、例えば、入れ子で設置したユーザー・コントロールに対して階層的にキャッシュ・ルールを設定することができる。End of Article

カテゴリ:Webフォーム 処理対象:キャッシング
使用キーワード:@OutputCacheディレクティブ
関連TIPS:[ASP.NET]サイト共通のレイアウト部分を部品化するには?
関連TIPS:[ASP.NET]リクエスト・パラメータごとにページをキャッシングするには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]リクエスト・パラメータごとにページをキャッシングするには?
[ASP.NET]サイト共通のレイアウト部分を部品化するには?
[ASP.NET]ユーザー・コントロールで属性を設定するには?
[ASP.NET]ページ内の一部分だけをキャッシュから除外するには?
[ASP.NET]ユーザー・コントロールでパーソナライズ可能なWebパーツを作成するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間