連載:〜ScottGu氏のブログより〜

ASP.NET 4の拡張可能な出力キャッシュ(VS 2010&.NET 4シリーズ)

Scott Guthrie 著/Chica
2010/02/10

 本記事は、Microsoftの本社副社長であり、ASP.NETやSilverlightなどの開発チームを率いるScott Guthrie氏のブログを翻訳したものです。氏の許可を得て転載しています。

[ブログに加え、現在Twitterを使って簡単な更新やリンク共有を行っています。twitter.com/scottguで、私をフォローしてください。]

 これは、VS 2010および.NET 4リリースに向けたブログ投稿シリーズの第14弾です。本日の投稿では、ASP.NET 4で行われた出力キャッシュの拡張性の改善をいくつかカバーします。これらは、すべてのASP.NET 4アプリケーション(ASP.NET WebフォームとASP.NET MVCの両方を使用して構築されたものを含む)で使用できます。

現在の出力キャッシュ

 出力キャッシュの概念はASP.NET 1.0で導入され、これにより開発者は、ページ、コントロール、コントローラ、HTTPレスポンスをインメモリのキャッシュへキャプチャし保存できます。一連のWebリクエストにおいてASP.NETは、出力を再生成するために、初期状態からページ/コントローラを実行しなくても、キャッシュから生成済みの出力を取得、使用することで、より速くコンテンツを提供できます。これはアプリケーションのパフォーマンスを劇的に改善します。特に、データベース内のデータに基づいたコンテンツの場合です(これはコンテンツが出力キャッシュにある場合、一連のリクエストでデータベースをアクセスする必要がなくなるからです)。

 ASP.NETの出力キャッシュ・システムは柔軟性があり、ページ/コントローラへのクエリ文字列/フォーム送信されたパラメータによって、異なるバージョンのコンテンツをキャッシュできます(例えば、Browse.aspx?category=BeveragesとBrowse.aspx?category=Meat)。また、アプリケーションを訪れたクライアントのブラウザ・タイプまたはユーザー言語の設定によって、異なるバージョンをキャッシュすることもできます。デスクトップのブラウザに最適化されたバージョンとは異なるモバイル・バージョンのページをキャッシュしたり、ユーザーがページを英語またはフランス語のどちらかで読みたいかによってキャッシュの内容を変化させたりすることも可能です。ASP.NETを構成すれば、特定の期間に対して特定の出力内容をキャッシュできます(例えば、1分間。これは、次のリクエストがコンテンツを再生成して再度キャッシュされるまでの時間)。またASP.NETを構成して、外部のイベントに動的に応じてキャッシュ内容を無効化することも可能です(例えば、キャッシュされているコンテンツの元になっているデータベースが変更された場合)。

 ASP.NET V1→V3.5での出力キャッシュに1つ制限があるのですが、それはキャッシュの保存自体に拡張性がなく、そのキャッシュされたコンテンツは常にインメモリに保存されていなければなりません。

ASP.NET 4出力キャッシュの拡張性

 ASP.NET 4では、開発者が1つ以上の独自の出力キャッシュ・プロバイダを構成できる、出力キャッシュの拡張ポイントを追加しました。出力キャッシュ・プロバイダは、出力キャッシュされたコンテンツを保存するための保存メカニズムなら、何でも利用できます。これにより、ローカル・ディスク、リモート・ディスク、データベース、クラウド・ストレージ、分散キャッシュ・エンジン(memcachedや“velocity”など)などを含む、いずれかの保存メカニズムを利用して、そのキャッシュされたコンテンツを保存する出力キャッシュ・プロバイダを簡単に作成できるようになります。

 ASP.NET 4の新しいSystem.Web.Caching.OutputCacheProviderクラスから派生させたクラスを作成することで、独自の出力キャッシュ・プロバイダが作成できます。派生クラスでは、4つのpublicメソッドをオーバーライドし、キャッシュ・コンテンツの追加/削除/取得/更新を実装します(それぞれのキャッシュ内容を識別するためのユニーク・キーが渡されます)。その後、ASP.NET 4を構成して、アプリケーションのweb.config内で<outputCache>要素の新しい<providers>セクションにより独自の出力キャッシュ・プロバイダを登録することで使用できます。


図1

 上記では、OutputCacheSample.dllアセンブリの“ScottOutputCache”クラスを使用して実装した新しい出力キャッシュ・プロバイダ (“SampleCache”と名付けました)を追加しました。また、コンテンツが出力キャッシュされたときは、“SampleCache”の実装が出力キャッシュ実装のデフォルトとして使用されるようにASP.NET を構成しています。これは<outputCache>要素上の“defaultProvider”属性を設定することで可能です。

 以上で、OutputCacheディレクティブを.aspxページのトップに追加すると、コンテンツはScottOutputCacheプロバイダを使用してキャッシュされ、保存されます。

<%@ OutputCache Duration="60" VaryByParam="None" %>

 同様にして、ASP.NET MVCのコントローラにある、いずれかのアクション・メソッド上で[OutputCache]属性を追加すると、ScottOutputCacheプロバイダを使用して、そのコンテンツもキャッシュされ、保存されます。


図2

使用する出力キャッシュ・プロバイダのカスタマイズ

 上記では、ASP.NETをデフォルトに設定して、アプリケーションで出力キャッシュが使用されたときはいつでも、常に“SampleCache”プロバイダを使用してキャッシュするように構成しています。

 もう少し高度なオプションとして、開発者はASP.NETを構成し、要求に応じて動的に出力キャッシュ・プロバイダを選択することもできます。これは、ちょっとリッチなキャッシュ方法をセットで用意したいといったシナリオに便利です。例えば、サイトの“ホーム”ページまたは“トップ10”のリクエスト・ページをビルトインのASP.NETのインメモリ・プロバイダを使用してキャッシュし(これはコンテンツがインメモリなので超高速です)、トラフィックの少ない、あまり頻繁にリクエストされないページをディスク上にキャッシュしたい場合です。

 アプリケーションのGlobal.asaxファイルにあるGetOutputCacheProviderNameメソッドをオーバーライドすることで、各リクエスト・ベースで動的にどの出力キャッシュ・プロバイダを使用するかを指定できます。以下では、アプリケーション内の“Home.aspx”ページにビルトインのインメモリASP.NET出力キャッシュ・プロバイダを使用し、それ以外のリクエストにはweb.configファイルに登録されているものを使用するように示しています。


図3

 シナリオに応じてプロバイダを簡単に切り替えるこの機能により、多くの非常に強力なシナリオが可能になります。

共通の出力キャッシュ・プロバイダ

 キャッシュされたコンテンツをファイル・システム上に保存する、ディスクベースの出力キャッシュ・プロバイダの実装方法を示したサンプルを出荷する予定です。また、新しいWindows Server AppFabricキャッシング・サービス(以前は“Velocity”として知られていた)と出力キャッシュを統合する方法を示したサンプルも出荷する予定です。AppFabricのキャッシング・サービスは、無償でフルサポートされるMicrosoft分散キャッシュ・システムになります。これも人気のオープンソースの分散キャッシング・システムであるmemcachedと一緒に、新しいASP.NET 4の出力キャッシュ拡張を簡単に利用できます。

 プロバイダの作成方法の詳細は、Stefan Schackow氏のPDC 2009でのASP.NET 4コア・ランタイム講演を見て確認できます。またこのPDC 2009講演でAppFabricのキャッシング・サービスについての詳細も確認できます。

まとめ

 ASP.NET 4に追加された出力キャッシュ・プロバイダの拡張性により、開発者は簡単にWebサイトやアプリケーションに対して、よりアグレッシブで、よりインテリジェントな出力キャッシュ戦略を追求できます。これらは、アプリケーションのパフォーマンスやレスポンスを大幅に改善でき、エンドユーザー体験を改善するとともに、要求されるサーバ・リソースを削減できます。

 Hope this helps,

 ScottEnd of Article

   
 
インデックス・ページヘ  「〜ScottGu氏のブログより〜」


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 記事ランキング

本日 月間