|
.NET TIPS [ASP.NET]任意のキーによりページ・キャッシュを切り替えるには?山田 祥寛2004/11/26 |
![]() |
|
|
|
「TIPS:[ASP.NET]リクエスト・パラメータごとにページをキャッシングするには?」では、@OutputCacheディレクティブのVaryByParam属性、VaryByHeader属性を用いることで、リクエスト・パラメータやヘッダ情報、ブラウザの単位にキャッシュを切り替える方法について紹介した(Dynamic Output Caching)。@OutputCacheディレクティブを利用することで、動的なページにおいても、ほとんどプログラムレスで適切なページ・キャッシュを実現することが可能となる。
しかし場合によっては、VaryByParam属性やVaryByHeader属性で指定可能なキーだけでは、キャッシュを振り分けられないようなケースがある。
例えば、ユーザーのログイン(認証)を必要とするサイトでは、ユーザーの権限(ロール)によってページを振り分けているかもしれない。その場合には、ページもロール単位にキャッシュする必要がある。あるいは、そもそも認証済みユーザーであるか否かによってページ・キャッシュを振り分けたいというケースもあるだろう。
はたまた、クライアント・サイド・スクリプトに強く依存したページを構築している場合、ブラウザが実装するJavaScript(ECMAScript)のバージョンによって、出力するクライアント・サイド・スクリプトを切り替えたいというケースもある。このような場合には、ECMAScriptのバージョンの単位にページ・キャッシュを振り分けるべきだろう。
いずれにせよ、こういったシチュエーションでは、VaryByParam属性やVaryByHeader属性でのキー指定だけでは、キャッシュの振り分けを賄うことができない。
そこで登場するのが、VaryByCustom属性だ。VaryByCustom属性では、キャッシュ・データを振り分けるためのキーを任意に指定することができる(デフォルトでは“Browser”のみを指定可能で、この場合にはクライアント・ブラウザの単位にキャッシュを切り替える)。本稿では、このVaryByCustom属性で指定可能なキーをカスタマイズすることで、任意のキーによってページ・キャッシュを切り替える方法について解説する。
●手順
1. Global.asaxの設定を行う
VaryByCustom属性により指定可能なキー文字列をカスタマイズする場合には、Global.asaxでHttpApplicationクラス(System.Web名前空間)のGetVaryByCustomStringメソッドをオーバーライドする。
以下の例では、GetVaryByCustomStringメソッドをオーバーライドして、カスタムのキーとして“ECMA”を設定し、クライアントが実装するECMAScriptのバージョンによってキャッシュを振り分けている。
|
|
| カスタムのキー文字列を指定するGlobal.asax(C#の場合) |
|
|
| カスタムのキー文字列を指定するGlobal.asax(VB.NETの場合) |
GetVaryByCustomStringメソッドは、HTTP要求の情報を保持したHttpContextオブジェクト(この例では「context」)とVaryByCustom属性で指定されたカスタム文字列を表すStringオブジェクト(この例では「arg」)をパラメータとして受け取る。ここでは、VaryByCustom属性で指定された文字列(arg)が“ECMA”であった場合に、クライアントが実装するECMAScriptのバージョンを「<メジャーバージョン>.<マイナーバージョン>」の形式の文字列で返す。ASP.NETでは、実際にはGetVaryByCustomStringメソッドによって返されたこの文字列をキーとしてキャッシング処理を行うというわけだ。
ちなみに、クライアント・ブラウザの機能構成を取得するには、クライアントに関する情報を保持するHttpBrowserCapabilitiesクラス(System.Web名前空間)を使えばよい。実行中のクライアント・ブラウザの情報を示すHttpBrowserCapabilitiesオブジェクトはHttpRequestクラス(System.Web名前空間)のBrowserプロパティにより取得できる。上記のコードでは、context.Request.BrowserのEcmaScriptVersionプロパティによりECMAScriptのバージョンを取得している。
2. 任意の.aspxファイルで@OutputCacheディレクティブを指定する
これで、アプリケーション配下の.aspxファイルからカスタムのキー文字列「ECMA」を利用できるようになった。前述のTIPS同様、クライアントが実装するECMAScriptのバージョンごとにキャッシュが切り替わることを確認してみよう。
|
|
| ページ・キャッシュを行うための.aspxファイル(C#:customCache_cs.aspx) |
|
|
| ページ・キャッシュを行うための.aspxファイル(VB.NET:customCache_vb.aspx) |
@OutputCacheディレクティブに関する詳細は、前述のTIPSを参照していただきたい。VaryByCustom属性を指定した場合にも、Duration属性、VaryByParam属性は必須である点に注意すること。もしもリクエスト・パラメータによる振り分けが不要である場合には、VaryByParam属性の値に“None”を指定すればよい。
3. 複数のブラウザでキャッシュの状態を確認する
それでは、該当のWebフォーム・ページに続けてアクセスして、キャッシュが有効になっている様子を確認してみよう。ここでは、Internet Explorer 6.0、Netscape Navigator 7.1、Opera 7.53を利用することにする。Internet Explorer 6.0のECMAScriptのバージョンは1.2、ほかのブラウザのECMAScriptは1.3である。
![]() |
| Internet Explorer 6.0でcustomCache_cs.aspxにアクセスしたところ |
![]() |
| Netscape Navigator 7.1でcustomCache_cs.aspxにアクセスしたところ |
![]() |
| Opera 7.53でcustomCache_cs.aspxにアクセスしたところ |
ECMAScriptのバージョンが同一であるNetscape NavigatorとOperaとは同一の最終更新日が表示され、Internet Explorerだけが異なる最終更新日となることが確認できるはずだ。これによって、ECMAScriptのバージョンによって、キャッシュ・データが振り分けられていることが確認できる。
■
ちなみに、本稿のサンプル・プログラムではカスタム文字列として“ECMA”という1種類だけを設定しているが、GetVaryByCustomStringメソッドの第2パラメータによって処理を切り替えることで、複数のカスタム文字列を設定することも可能だ。例えば、Microsoftが提供するサンプル・アプリケーション「.NET PetShop」では、ログイン状態やそのほかのキーによって細かなキャッシュの制御を実現している。VaryByCustom属性を理解する好例でもあるので、興味のある方は併せて確認してみるとよいだろう。![]()
| カテゴリ:Webフォーム 処理対象:キャッシング 使用キーワード:@OutputCacheディレクティブ 使用ライブラリ:HttpApplicationクラス(System.Web名前空間) 使用ライブラリ:HttpContextクラス(System.Web名前空間) 使用ライブラリ:HttpRequestクラス(System.Web名前空間) 使用ライブラリ:HttpBrowserCapabilitiesクラス(System.Web名前空間) 関連TIPS:[ASP.NET]リクエスト・パラメータごとにページをキャッシングするには? |
|
||||||||||||||||
| 「.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 -





