ASP.NET MVCでクライアントキャッシュを有効にする方法(ASP.NET MVC Client Caching)

筆者は、CSSや多くのjpgなどのイメージファイルを使用したWebサイトをホスティングサーバー(レンタルサーバー)上で稼動させている。
サーバーはIIS6.0でASP.NET MVCのWebアプリケーションである。あるとき、 Google Page Speedでサイトのパフォーマンスを測定してみた。85点あったのであるが、改善点のひとつにLeverage browser cachingがあった。ブラウザのクライアントキャッシュが利いていないということである。IIS6を完全に操作できるのであれば、仮想フォルダのプロパティを選んだ後、[HTTPヘッダー]タブを選び「コンテンツの有効期限を設定する」で有効期限を設定すればよい。IIS7および7.5では、IIS マネージャーの[機能ビュー] で、[出力のキャッシュ] をダブルクリックして設定することができる。
しかし、筆者がレンタルしているホスティングサーバーは、IISを間借りしているだけなので、この設定を行うことができなかった。

そこで、「Caching Images in ASP.NET
」を参考にクライアントキャッシュを実現した。
「Caching Images in ASP.NET」は、ASP.NET用の使用例であるが、ASP.NET MVCでも使用することができた。

簡単に説明すると、クライアントからのjpgファイルのリクエストをIISで処理させず、ASP.NET側にリクエストをで処理させる。ASP.NET側で有効期限を追加してレスポンスを返すのである。仕組みは次のとおりである。(jpgファイルの場合)
  1. ブラウザがjpgファイルをリクエストする
  2. IISが要求を受け取りASP.NETへ要求を送る。通常は、jpg拡張子はHttpハンドラにマッピングされていないので、IISはそのままjpgファイルを返すが、jpgファイルの要求をASP.NETに渡すようにスクリプトマッピングの設定を追加する。(後述)
  3. ASP.NETのカスタムHTTPハンドラで要求を受け取り、有効期限を追加してレスポンスを返す。Web.configのhttpHandlersの設定を追加することで可能になる。(後述)
  4. 有効期限が追加されたjpgファイルがクライアントに表示される。以降、有効期限内であればブラウザはこのjpgファイルをリクエストしないので、パフォーマンスが向上する

手順は次のとおりである。
まず、CachingHandlerクラスとCachingSectionクラスをサンプルと同じように作成します。
下記の例では、HelpersフォルダにCachingHandlerクラスを追加している。
jpg,gif,pngおよびcssファイルをキャッシュするようにする設定である。

まぜ、web.configにsectionGroupを追加する。

続いて、Web.configのhttpHandlersに下記の4つを追加する。
IIS6の場合は、次のように拡張子に応じてハンドラのマッピングを行う。

続いて、サンプルどおりにSoftwareArchitectsセクションを追加する。有効期限は30日としている。

IIS7および7.5の統合モードで使用する場合は、httpHandlersセクションに次の設定を追加する。
統合モードの場合は、ここの設定がHTTPハンドラマッピングの反映されるので、IISの作業は不要である。

最後にASP.NET MVCのURLルーティング設定を変更する。これら4ファイルのリクエストをASP.NET MVCで処理せず、HTTPハンドラで処理するため、Global.asax.csファイルのRegisterRoutesで以下のように、4行を追加する。

なお、最後に仮想フォルダのプロパティで、アプリケーションの拡張子のマッピングが必要である。拡張子がjpgの場合に、aspnet_isapi.dllで処理するように設定する。[仮想ディレクトリ]タブで[構成]ボタンを押して、[アプリケーションの構成]ダイアログを開き、マッピングの設定を行えばよい。(筆者の場合、この操作はホスティングサーバーの会社に依頼すると追加してもらえた。)同様にgif、png、cssについても作業を行う。

トラックバック

トラックバックURL:
http://www.apricot-jp.com/cgi/mt/mt-tb.cgi/442

関連情報

Copyright(C) 2007 アーキテクト360 Allrights reserved.