|
.NET TIPS [ASP.NET]ページ内の一部分だけをキャッシュから除外するには?[2.0のみ、C#、VB]山田 祥寛2006/01/13 |
![]() |
|
|
|
ASP.NETには「ページ・キャッシュ」「データ・キャッシュ」などさまざまなキャッシュ技術が用意されているが(詳細はTIPS「[ASP.NET]データセットをキャッシングするには?」「[ASP.NET]リクエスト・パラメータごとにページをキャッシングするには?」を参照)、その中でもフラグメント・キャッシュは特徴的なキャッシュ技術の1つだ。
フラグメント・キャッシュとは、ページの断片(フラグメント)単位に異なるキャッシュ・ポリシーを設定するための仕組みである。フラグメント・キャッシュを利用することで、ページ全体に対して一律のキャッシュ・ポリシーを設定する場合に比べ、個々のコンテンツに即したより効果的なキャッシングが可能になる。詳細については、「TIPS:[ASP.NET]Webフォーム・ページの一部分を断片的にキャッシングするには?」を参照するとよいだろう。
もっとも、ASP.NET 1.xのフラグメント・キャッシュには課題もあった。例えば、キャッシュを利用したページの中でほんの一部分だけダイナミックな情報を出力したいという場合にも、ASP.NET 1.xではその一部分のコンテンツのためだけに、わざわざユーザー・コントロールを定義するしかなかった。しかし、出力する対象がごく単純な文字列である場合、いちいちユーザー・コントロールとして外部化することは、かえってアプリケーションの管理を煩雑にする原因にもなる。これを忌避して、そもそもページ全体でキャッシュを無効にしてしまったという諸兄も多いのではないだろうか。
そこでASP.NET 2.0で新たに登場したのが、SubstitutionコントロールとWriteSubstitutionメソッドだ。これらを利用することで、ページ上で設定されたキャッシュ・ポリシーにかかわらず、Substitutionコントロールで定義された部分だけを常に動的に生成できるようになる。
●Substitutionコントロールを使用した例
それではさっそく、具体的な例を見てみよう。まずはSubstitutionコントロールからだ。
|
|
| Substitutionコントロールを利用したキャッシュ除外の例(C#版:substitution_cs.aspx) |
|
|
| Substitutionコントロールを利用したキャッシュ除外の例(VB版:substitution_vb.aspx) |
Substitutionコントロールはとても単純なコントロールだ。id、runatなどコントロール共通の属性を除けば、MethodName属性にSubstitutionコントロールから呼び出されるコールバック・メソッドの名前(ここではGetTime)を指定すればよい。Substitutionコントロールは、自分自身が呼び出されるたびにMethodNameプロパティで指定されたメソッドを呼び出し、そのメソッドから返された文字列を「常に動的に」出力するというわけだ。
後は、Substitutionコントロールによって呼び出されるコールバック・メソッドを記述するだけだ。コールバック・メソッドはページ上(またはユーザー・コントロール)で定義された静的メソッドである必要がある。また、そのシグネチャは、HttpResponseSubstitutionCallbackデリゲートのそれ(パラメータとしてHttpContextオブジェクトを受け取り、戻り値としてString型を返す)と一致していなければならない点に注意してほしい。
以上を理解したら、さっそくsubstitution_cs.aspx/substitution_vb.aspxを実行してみよう。初回のアクセスでは、Labelコントロール、Substitutionコントロールともに同じ時刻が表示されているが、リフレッシュしてみると、Substitutionコントロールの時刻だけが(キャッシュ・ポリシーにかかわらず)更新されているのが確認できるだろう。
![]() |
![]() |
| substitution_cs.aspx/substitution_vb.aspxの実行結果 |
| 上の画面が初回アクセス時の、下の画面が2回目のアクセス時の実行結果だ。2回目のアクセスでは、Substitutionコントロール上の時刻だけが更新されていることが確認できる。 |
| [参考] |
|
ちなみに、AdRotatorは、キャッシュ除外のサポートを内部的に実装しているコントロールだ。つまり、AdRotatorコントロールによる出力は、キャッシュ・ポリシーにかかわらず、常に動的に生成される。 |
●WriteSubstitutionメソッドを使用した例
Substitutionコントロールと同様の処理は、Response.WriteSubstitutionメソッドを利用することでも実現できる。以下は、先ほどのサンプル・コードをWriteSubstitutionメソッドで書き換えたものだ。
なお、本サンプル・プログラムではコード簡略化のために、<%〜%>ブロックによるHTML埋め込み型の記法を採用しているが、<%〜%>はもともと、旧来のASP 3.0との互換性のためにのみ残された記法である。ASP.NETでは推奨されないことを、あらためてここで確認しておきたい。
|
|
| WriteSubstitutionメソッドを利用したキャッシュ除外の例(C#版:writeSubstitution_cs.aspx) |
|
|
| WriteSubstitutionメソッドを利用したキャッシュ除外の例(VB版:writeSubstitution_vb.aspx) |
WriteSubstitutionメソッドを利用することで、Substitutionコントロール同様、リクエストごとに指定されたコールバック・メソッドを呼び出し、常に動的な出力を生成できるようになる。以上のコードを実行し、先ほどと同様の結果が得られれば成功だ。![]()
| 利用可能バージョン:.NET Framework 2.0のみ カテゴリ:Webフォーム 処理対象:キャッシュ 使用ライブラリ:Substitutionコントロール 関連TIPS:[ASP.NET]データセットをキャッシングするには? 関連TIPS:[ASP.NET]リクエスト・パラメータごとにページをキャッシングするには? 関連TIPS:[ASP.NET]Webフォーム・ページの一部分を断片的にキャッシングするには? |
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -




