チュートリアル : 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 ハンドラ ファクトリ クラスを作成するには
ASP.NET Web サイトにまだ App_Code ディレクトリがない場合は、サイトのルートの下に App_Code ディレクトリを作成します。
App_Code ディレクトリで、HelloWorldHandler という名前のクラスを作成します。
クラス ファイルに次のコードを追加します。
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 クラスを作成するには
Web サイトの App_Code ディレクトリで、HelloWorldHandler という名前のクラスを作成します。
クラス ファイルに「チュートリアル : 同期 HTTP ハンドラの作成」のコードを追加します。
Web サイトの App_Code ディレクトリで、HelloWorldAsyncHandler という名前のクラスを作成します。
クラス ファイルに「方法 : 非同期 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 でハンドラ ファクトリを登録するには
Web サイトにまだ Web.config ファイルがない場合は、サイトのルートの下に Web.config ファイルを作成します。
Web.config ファイルに次の強調表示されたコードを追加します。
<configuration> <system.web> <httpHandlers> <add verb="GET,POST" path="*.sample" type="HandlerFactory" /> </httpHandlers> </system.web> </configuration>
このコードでは、クラス名と HandlerFactory のハンドラ名を使用してハンドラ ファクトリを登録します。
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 にハンドラ ファクトリを登録するには
Web サイトに Web.config ファイルがない場合は、Web.config ファイルを作成します。
Web.config ファイルに次の強調表示されたコードを追加します。
メモ : 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 ファイル名拡張子がマップされます。
メモ : カスタム ファイル名拡張子を登録するので、handlers セクションと httpHandlers セクションの両方にハンドラを登録します。クラシック モードでは、下位互換性を確保するために、ハンドラは modules 属性を使用して ISAPI モジュールとして指定されます。ASP.NET ISAPI dll のパスは、scriptProcessor 属性を使用して指定されます。name 属性は handlers セクションでは必須です。
統合モードで実行されている IIS 7.0 にハンドラ ファクトリを登録するには
Web サイトにまだ Web.config ファイルがない場合は、サイトのルートの下に Web.config ファイルを作成します。
Web.config ファイルに次の強調表示されたコードを追加します。
<configuration> <system.webServer> <handlers> <add verb="GET,POST" path="*.sample" name="HandlerFactory" type="HandlerFactory"/> </handlers> </system.webServer> </configuration>
構成要素により、カスタム ハンドラ ファクトリがクラス名で登録され、そのハンドラに .sample ファイル名拡張子がマップされます。
メモ : 登録は、httpHandlers セクションではなく handlers セクションで行われます。name 属性は必須です。
カスタム HTTP ハンドラ ファクトリのテスト
カスタム HTTP ハンドラ ファクトリを作成して登録すると、それをテストできます。
カスタム HTTP ハンドラ ファクトリをテストするには
アプリケーションで HTML ページ (ファイル名拡張子は .htm) を作成します。
ページの 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>
ブラウザで HTML ページを要求します。
いずれかのボタンをクリックします。
1 番目のボタンをクリックした場合、HTTP ハンドラ ファクトリは同期 HTTP ハンドラの作成および呼び出しを行って要求に応答します。2 番目のボタンをクリックした場合、HTTP ハンドラ ファクトリは非同期 HTTP ハンドラの作成および呼び出しを行って要求に応答します。
参照
処理手順
概念
IIS 5.0 および 6.0 における ASP.NET アプリケーションのライフ サイクルの概要