チュートリアル : カスタム HTTP モジュールを作成および登録する
更新 : 2007 年 11 月
このチュートリアルでは、カスタム HTTP モジュールの基本機能を説明します。HTTP モジュールは、要求が行われるたびに、BeginRequest イベントおよび EndRequest イベントに応答して呼び出されます。したがって、このモジュールは要求の処理前と処理後に実行されることになります。
ASP.NET アプリケーションが IIS 6.0 の下で実行されている場合は、HTTP モジュールを使用して、ASP.NET によってサービス提供されているリソースに対する要求をカスタマイズできます。このようなリソースには、ASP.NET Web ページ (.aspx ファイル)、Web サービス (.asmx ファイル)、ASP.NET ハンドラ (.ashx ファイル)、および ASP.NET に割り当てられた任意のファイルの種類が含まれます。ASP.NET アプリケーションが IIS 7.0 の下で実行されている場合は、HTTP モジュールを使用して、IIS によってサービス提供されている任意のリソースに対する要求をカスタマイズできます。このようなリソースには、ASP.NET のリソースだけでなく、HTML ファイル (.htm ファイルまたは .html ファイル) やグラフィックス ファイルなども含まれます。詳細については、「IIS 5.0 および 6.0 における ASP.NET アプリケーションのライフ サイクルの概要」および「IIS 7.0 における ASP.NET アプリケーションのライフ サイクルの概要」を参照してください。
このトピックで示すモジュールの例では、すべての HTTP 要求の冒頭で、要求された ASP.NET Web ページにメッセージを追加します。また、ページの処理後にも別のメッセージを追加します。このモジュールには、他の種類のファイルに対する要求にはテキストを追加しないようにするコードが含まれています。
各イベント ハンドラは、モジュールのプライベート メソッドとして記述されます。登録されたイベントが発生すると、ASP.NET がモジュール内の適切なハンドラを呼び出し、そのメソッドが ASP.NET Web ページに情報を書き込みます。
このチュートリアルでは、以下のタスクを行います。
HTTP モジュールのコードの作成。
Web.config ファイルでのモジュールの登録。
必要条件
このチュートリアルを完了させるには、次の操作が必要です。
- Visual Studio または Visual Web Developer。
IIS 6.0 または IIS 7.0 を使用していることも前提とします。ただし、ASP.NET 開発サーバーを実行している場合でも、モジュールの機能を確認できます。
カスタム HTTP モジュール クラスの作成
まず、モジュールを実装するクラス ファイルを作成します。
カスタム HTTP モジュール クラスを作成するには
ASP.NET Web サイトを作成し、サイト名を Handler とします。
メモ : Web サイト名には、任意の名前を選択できます。
Web サイトにまだ App_Code ディレクトリがない場合は、サイトのルートの下に App_Code ディレクトリを作成します。
App_Code ディレクトリ内に、HelloWorldModule.vb (Visual Basic の場合) または HelloWorldModule.cs (C# の場合) という名前でクラス ファイルを作成します。
メモ : または、Visual Web Developer Express Edition ではなく Visual Studio を使用している場合は、HelloWorldModule をクラス ライブラリ プロジェクトとして作成し、これをコンパイルして、結果のアセンブリを Web アプリケーションの Bin ディレクトリに配置することもできます。
クラス ファイルに次のコードを追加します。
Imports Microsoft.VisualBasic Imports System.Web Public Class HelloWorldModule Implements IHttpModule Public Sub New() End Sub Public ReadOnly Property ModuleName() As String Get Return "HelloWorldModule" End Get End Property ' In the Init function, register for HttpApplication ' events by adding your handlers. Public Sub Init(ByVal application As HttpApplication) _ Implements IHttpModule.Init AddHandler application.BeginRequest, _ AddressOf Me.Application_BeginRequest AddHandler application.EndRequest, _ AddressOf Me.Application_EndRequest End Sub Private Sub Application_BeginRequest(ByVal source As Object, _ ByVal e As EventArgs) ' Create HttpApplication and HttpContext objects to access ' request and response properties. Dim application As HttpApplication = DirectCast(source, _ HttpApplication) Dim context As HttpContext = application.Context Dim filePath As String = context.Request.FilePath Dim fileExtension As String = _ VirtualPathUtility.GetExtension(filePath) If fileExtension.Equals(".aspx") Then context.Response.Write("<h1><font color=red>" & _ "HelloWorldModule: Beginning of Request" & _ "</font></h1><hr>") End If End Sub Private Sub Application_EndRequest(ByVal source As Object, _ ByVal e As EventArgs) Dim application As HttpApplication = DirectCast(source, _ HttpApplication) Dim context As HttpContext = application.Context Dim filePath As String = context.Request.FilePath Dim fileExtension As String = _ VirtualPathUtility.GetExtension(filePath) If fileExtension.Equals(".aspx") Then context.Response.Write("<hr><h1><font color=red>" & _ "HelloWorldModule: End of Request</font></h1>") End If End Sub Public Sub Dispose() Implements System.Web.IHttpModule.Dispose End Sub End Class
using System; using System.Web; public class HelloWorldModule : IHttpModule { public HelloWorldModule() { } public String ModuleName { get { return "HelloWorldModule"; } } // In the Init function, register for HttpApplication // events by adding your handlers. public void Init(HttpApplication application) { application.BeginRequest += (new EventHandler(this.Application_BeginRequest)); application.EndRequest += (new EventHandler(this.Application_EndRequest)); } private void Application_BeginRequest(Object source, EventArgs e) { // Create HttpApplication and HttpContext objects to access // request and response properties. HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; string filePath = context.Request.FilePath; string fileExtension = VirtualPathUtility.GetExtension(filePath); if (fileExtension.Equals(".aspx")) { context.Response.Write("<h1><font color=red>" + "HelloWorldModule: Beginning of Request" + "</font></h1><hr>"); } } private void Application_EndRequest(Object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; string filePath = context.Request.FilePath; string fileExtension = VirtualPathUtility.GetExtension(filePath); if (fileExtension.Equals(".aspx")) { context.Response.Write("<hr><h1><font color=red>" + "HelloWorldModule: End of Request</font></h1>"); } } public void Dispose() { } }
クラス ファイルを保存して、閉じます。
[ビルド] メニューの [Web サイトのビルド] をクリックします。
Web サイトがビルドされない場合は、問題を修正します。カスタム HTTP モジュールがコンパイルされなければ、モジュールを登録できません。
IIS 6.0 および IIS 7.0 のクラシック モードでの HTTP モジュールの登録
HelloWorldModule クラスを作成したら、Web.config ファイル内にエントリを作成してモジュールを登録します。HTTP モジュールを登録すると、そのモジュールで要求パイプライン通知をサブスクライブできます。
IIS 7.0 では、クラシック モードまたは統合モードでアプリケーションを実行できます。クラシック モードでは、要求は IIS 6.0 の場合と基本的に同じ方法で処理されます。統合モードでは、IIS 7.0 は ASP.NET と要求、モジュール、およびその他の機能を共有できるようにするパイプラインを使用して要求を管理します。
モジュールの登録手順は、IIS 7.0 のクラシック モードと IIS 7.0 の統合モードとの間で異なります。ここでは、IIS 6.0 および IIS 7.0 のクラシック モードでの手順を説明します。IIS 7.0 の統合モードで動作するモジュールの登録手順については、次のセクションで説明します。
IIS 6.0 およびクラシック モードで実行されている IIS 7.0 でモジュールを登録するには
Web サイトにまだ Web.config ファイルがない場合は、サイトのルートの下に Web.config ファイルを作成します。
次のコードの強調表示された部分を Web.config ファイルに追加します。
<configuration> <system.web> <httpModules> <add name="HelloWorldModule" type="HelloWorldModule"/> </httpModules> </system.web> </configuration>
このコードは、クラス名と HelloWorldModule のモジュール名を使用してモジュールを登録します。
IIS 7.0 統合モードでの HTTP モジュールの登録
IIS 7.0 の統合モードでのモジュールの登録手順は、IIS 7.0 のクラシック モードの手順とは少し異なります。
統合モードで実行されている IIS 7.0 でモジュールを登録するには
Web サイトにまだ Web.config ファイルがない場合は、サイトのルートの下に Web.config ファイルを作成します。
次のコードの強調表示された部分を Web.config ファイルに追加します。
<configuration> <system.webServer> <modules> <add name="HelloWorldModule" type="HelloWorldModule"/> </modules> </system.webServer> </configuration>
メモ : IIS マネージャを使用してモジュールを登録することもできます。詳細については、「IIS 7.0 Beta: Configuring Modules in IIS 7.0」を参照してください。
このコードは、クラス名と HelloWorldModule のモジュール名を使用してモジュールを登録します。
カスタム HTTP モジュールのテスト
カスタム HTTP モジュールを作成して登録すると、それをテストできます。
カスタム HTTP モジュールをテストするには
アプリケーションに新しい ASP.NET ページを追加します。
追加したページを右クリックし、[ブラウザで表示] をクリックします。
HTTP モジュールが、応答の最初と最後に文字列を付加します。ASP.NET に拡張子が割り当てられているファイルに対するすべての要求に対して、モジュールが自動的に実行されます。詳細については、「HTTP ハンドラと HTTP モジュールの概要」を参照してください。