チュートリアル : カスタム HTTP モジュールを作成および登録する

このチュートリアルでは、カスタム 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 モジュール クラスを作成するには

  1. ASP.NET Web サイトを作成し、サイト名を Handler とします。

    メモメモ

    Web サイト名には、任意の名前を選択できます。

  2. Web サイトにまだ App_Code ディレクトリがない場合は、サイトのルートの下に App_Code ディレクトリを作成します。

  3. App_Code ディレクトリ内に、HelloWorldModule.vb (Visual Basic の場合) または HelloWorldModule.cs (C# の場合) という名前でクラス ファイルを作成します。

    メモメモ

    または、Visual Web Developer Express ではなく Visual Studio を使用している場合は、HelloWorldModule をクラス ライブラリ プロジェクトとして作成し、これをコンパイルして、結果のアセンブリを Web アプリケーションの Bin ディレクトリに配置することもできます。

  4. クラス ファイルに次のコードを追加します。

    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() { }
    }
    
  5. クラス ファイルを保存して、閉じます。

  6. [ビルド] メニューの [Web サイトのビルド] をクリックします。

    Web サイトがビルドされない場合は、問題を修正します。 カスタム 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 でモジュールを登録するには

  1. Web サイトにまだ Web.config ファイルがない場合は、サイトのルートの下に Web.config ファイルを作成します。

  2. 次のコードの強調表示された部分を Web.config ファイルに追加します。

    <configuration>
      <system.web>
        <httpModules>
          <add name="HelloWorldModule" type="HelloWorldModule"/>
         </httpModules>
      </system.web>
    </configuration>
    

    このコードは、クラス名と HelloWorldModule のモジュール名を使用してモジュールを登録します。

IIS 7.0 の統合モードでのモジュールの登録手順は、IIS 7.0 のクラシック モードの手順とは少し異なります。

統合モードで実行されている IIS 7.0 でモジュールを登録するには

  1. Web サイトにまだ Web.config ファイルがない場合は、サイトのルートの下に Web.config ファイルを作成します。

  2. 次のコードの強調表示された部分を 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 モジュールをテストするには

  1. アプリケーションに新しい ASP.NET ページを追加します。

  2. 追加したページを右クリックし、[ブラウザーで表示] をクリックします。

    HTTP モジュールが、応答の最初と最後に文字列を付加します。 ASP.NET に拡張子が割り当てられているファイルに対するすべての要求に対して、モジュールが自動的に実行されます。 詳細については、「HTTP ハンドラーと HTTP モジュールの概要」を参照してください。

コミュニティの追加

追加
表示: