次の方法で共有


チュートリアル : HTTP ハンドラ ファクトリの作成と登録

更新 : 2007 年 11 月

IHttpHandlerFactory インターフェイスは、要求を処理する HTTP ハンドラを作成および管理します。したがって、IHttpHandlerFactory インターフェイスを実装するクラスを作成し、そのクラスを HTTP ハンドラとして使用できます。

この方法でハンドラを作成すると、HTTP 要求の処理をより細かく制御できます。一連の条件に基づいて別のハンドラを作成する HTTP ハンドラ ファクトリに URL を割り当てることができます。たとえば、HTTP ハンドラ ファクトリを使用して、データベース接続のようなコストの高いリソースや限られたリソースにアクセスする限られた数の HTTP ハンドラ オブジェクトを作成できます。また、それらのハンドラ オブジェクトをその後の要求に再利用できます。

このチュートリアルでは、.sample 拡張子で識別されるリソースの 2 つのハンドラを作成する HTTP ハンドラ ファクトリを作成します。1 つのハンドラは HTTP GET 要求中にリソースを操作し、もう 1 つのハンドラは HTTP POST 要求を操作します。最初のハンドラは、「チュートリアル : 同期 HTTP ハンドラの作成」で説明しているハンドラのインスタンスです。2 番目のハンドラは、「方法 : 非同期 HTTP ハンドラを作成する」で説明しているハンドラのインスタンスです。

このチュートリアルでは、以下のタスクを行います。

  • HTTP ハンドラ ファクトリ クラスのコードを作成する方法。

  • Web.config ファイルにハンドラ ファクトリを登録して .sample 拡張子にマップする方法。

  • インターネット インフォメーション サービス (IIS: Internet Information Service) で .sample ファイル名拡張子を ASP.NET にマップする方法。

必要条件

このチュートリアルを実行するための要件は次のとおりです。

  • Visual Studio または Visual Web Developer。

  • IIS を使用して実行できる ASP.NET Web サイト。

  • IIS 6.0 または IIS 7.0。

カスタム HTTP ハンドラ ファクトリの作成

まず、ハンドラ ファクトリ クラスを作成します。

HTTP ハンドラ ファクトリ クラスを作成するには

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

  2. App_Code ディレクトリで、HelloWorldHandler という名前のクラスを作成します。

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

    Imports System
    Imports System.Web
    
    Class HandlerFactory
        Implements IHttpHandlerFactory
    
        Public Function GetHandler(ByVal context As HttpContext, _
                ByVal requestType As String, ByVal url As [String],_ 
                ByVal pathTranslated As [String]) As IHttpHandler _
                Implements IHttpHandlerFactory.GetHandler
            Dim handlerToReturn As IHttpHandler
            Dim requestType as String = _      
                context.Request.RequestType.ToLower()
            If "get" = requestType Then
                handlerToReturn = New HelloWorldHandler()
            Else
                If "post" = requestType Then
                    handlerToReturn = New HelloWorldAsyncHandler()
                Else
                    handlerToReturn = Nothing
                End If
            End If
            Return handlerToReturn
        End Function
    
        Public Sub ReleaseHandler(ByVal handler As IHttpHandler) _
            Implements IHttpHandlerFactory.ReleaseHandler
        End Sub
    
        Public ReadOnly Property IsReusable() As Boolean
            Get
                Return False
            End Get
        End Property
    End Class
    
    using System;
    using System.Web;
    
    class HandlerFactory : IHttpHandlerFactory
    {
        public IHttpHandler GetHandler(HttpContext context, 
            string requestType, String url, String pathTranslated)
        {
            IHttpHandler handlerToReturn;
            if ("get" == context.Request.RequestType.ToLower())
            {
                handlerToReturn = new HelloWorldHandler();
            }
            else if ("post" == context.Request.RequestType.ToLower())
            {
                handlerToReturn = new HelloWorldAsyncHandler();
            }
            else
            {
                handlerToReturn = null;
            }
            return handlerToReturn;
        }
        public void ReleaseHandler(IHttpHandler handler)
        {
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
    

    このコードは、IHttpHandlerFactory インターフェイスの GetHandler メソッドを実装します。要求が GET 要求である場合、メソッドは同期ハンドラ インターフェイスを返します。要求が POST 要求である場合は、非同期ハンドラ インターフェイスを返します。

カスタム HTTP ハンドラの作成

カスタム HTTP ハンドラ ファクトリは、「チュートリアル : 同期 HTTP ハンドラの作成」で説明している同期ハンドラか、または「方法 : 非同期 HTTP ハンドラを作成する」で説明している非同期ハンドラを返します。カスタム HTTP ハンドラ ファクトリがこれらのハンドラを返せるようにするには、HelloWorldHandler 同期クラスと HelloWorldAsyncHandler 非同期クラスの両方を作成する必要があります。

HelloWorldHandler クラスと HelloWorldAsyncHandler クラスを作成するには

  1. Web サイトの App_Code ディレクトリで、HelloWorldHandler という名前のクラスを作成します。

  2. クラス ファイルに「チュートリアル : 同期 HTTP ハンドラの作成」のコードを追加します。

  3. Web サイトの App_Code ディレクトリで、HelloWorldAsyncHandler という名前のクラスを作成します。

  4. クラス ファイルに「方法 : 非同期 HTTP ハンドラを作成する」のコードを追加します。

IIS 6.0 でのカスタム HTTP ハンドラ ファクトリの登録

カスタム HTTP ハンドラ ファクトリ クラスを作成した後、アプリケーションの Web.config ファイルに登録する必要があります。これにより、ASP.NET はハンドラ ファクトリ クラスを使用して、.sample ファイル名拡張子を持つリソースに対する要求に対応できるようになります。

IIS 6.0 または IIS 7.0 のどちらを使用しているかによって、ハンドラを登録する方法は異なります。このセクションでは、IIS 6.0 でハンドラを登録する方法について説明します。次のセクションでは、IIS 7.0 でハンドラを登録する方法について説明します。

IIS 6.0 でハンドラ ファクトリを登録するには

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

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

    <configuration>
      <system.web>
        <httpHandlers>      <add verb="GET,POST" path="*.sample"        type="HandlerFactory" />    </httpHandlers>
      </system.web>
    </configuration>
    

    このコードでは、クラス名と HandlerFactory のハンドラ名を使用してハンドラ ファクトリを登録します。

  3. IIS マネージャを使用して、.sample 拡張子のアプリケーション拡張子の割り当てを登録します。詳細については、「方法 : IIS で HTTP ハンドラ拡張子を構成する」を参照してください。

IIS 7.0 でのカスタム HTTP ハンドラ ファクトリの登録

IIS 7.0 では、クラシック モードまたは統合モードでアプリケーションを実行できます。クラシック モードでは、要求は IIS 6.0 の場合とほぼ同じ方法で処理されます。統合モードでは、IIS 7.0 は要求、モジュール、およびその他の機能を ASP.NET と共有できるようにするパイプラインを使用して要求を管理します。

IIS 7.0 では、Web.config ファイルまたは IIS マネージャにハンドラ ファクトリを登録します。管理は IIS 7.0 に一元化されているため、アプリケーションの Web.config ファイルを変更すると、アプリケーションの IIS マネージャ インターフェイスに反映されます。その逆もまた同様です。次の手順では、ハンドラは Web.config ファイルに登録されます。

クラシック モードで実行されている IIS 7.0 にハンドラ ファクトリを登録するには

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

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

    ms227439.alert_note(ja-jp,VS.90).gifメモ :

    aspnet_isapi.dll ファイルを正しいパスに置き換えます。.dll ファイルは、.NET Framework がインストールされているフォルダにあります。既定では、これは C:\WINDOWS\Microsoft.NET\Framework\version です。

    <configuration>
      <system.webServer>
        <handlers>      <add  verb="GET,POST" path="*.sample"         name="HandlerFactory"         type="HandlerFactory"         modules="IsapiModule"/>         scriptProcessor="%path%\aspnet_isapi.dll"    </handlers>
      </system.webServer>
    </configuration>
    

    構成要素により、カスタム ハンドラ ファクトリがクラス名で登録され、そのハンドラに .sample ファイル名拡張子がマップされます。

    ms227439.alert_note(ja-jp,VS.90).gifメモ :

    カスタム ファイル名拡張子を登録するので、handlers セクションと httpHandlers セクションの両方にハンドラを登録します。クラシック モードでは、下位互換性を確保するために、ハンドラは modules 属性を使用して ISAPI モジュールとして指定されます。ASP.NET ISAPI dll のパスは、scriptProcessor 属性を使用して指定されます。name 属性は handlers セクションでは必須です。

統合モードで実行されている IIS 7.0 にハンドラ ファクトリを登録するには

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

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

    <configuration>
      <system.webServer>
        <handlers>      <add verb="GET,POST" path="*.sample"         name="HandlerFactory"        type="HandlerFactory"/>    </handlers>
      </system.webServer>
    </configuration>
    

    構成要素により、カスタム ハンドラ ファクトリがクラス名で登録され、そのハンドラに .sample ファイル名拡張子がマップされます。

    ms227439.alert_note(ja-jp,VS.90).gifメモ :

    登録は、httpHandlers セクションではなく handlers セクションで行われます。name 属性は必須です。

カスタム HTTP ハンドラ ファクトリのテスト

カスタム HTTP ハンドラ ファクトリを作成して登録すると、それをテストできます。

カスタム HTTP ハンドラ ファクトリをテストするには

  1. アプリケーションで HTML ページ (ファイル名拡張子は .htm) を作成します。

  2. ページの body セクションに次のマークアップを追加します。

    <form action="Sample.sample" method="get">
      <input type="submit" value="Submit to Sample.sample via Get" />
    </form>
    <br />
    <form action="Sample.sample" method="post">
      <input type="submit" value="Submit to Sample.sample via Post" />
    </form>
    
  3. ブラウザで HTML ページを要求します。

  4. いずれかのボタンをクリックします。

    1 番目のボタンをクリックした場合、HTTP ハンドラ ファクトリは同期 HTTP ハンドラの作成および呼び出しを行って要求に応答します。2 番目のボタンをクリックした場合、HTTP ハンドラ ファクトリは非同期 HTTP ハンドラの作成および呼び出しを行って要求に応答します。

参照

処理手順

方法 : 非同期 HTTP ハンドラを作成する

チュートリアル : 同期 HTTP ハンドラの作成

概念

IIS 5.0 および 6.0 における ASP.NET アプリケーションのライフ サイクルの概要

その他の技術情報

HTTP ハンドラの概要