シンプルなASP.NET ハンドラーを作成して、ASP.NETハンドラーの実装手順を紹介します。
概要
ASP.NETハンドラーを利用すると、指定したURLに対する処理を実装できます。この記事ではシンプルなASP.NETハンドラーを実装してASP.NETハンドラーの実装手順を紹介します。
ジェネリックハンドラーとの違い
ジェネリックハンドラーはUI を持たない汎用のHTTPハンドラです。拡張子はashxで、ロジックはashx.csファイルに記述します。
作成したashxのファイル名のURLにアクセスすることで、HTTPレスポンスを返します。
一方ASP.NETハンドラーは拡張子はC#の場合はcsであり、C#のコードファイルです。ページのファイルは作成しません。
ASP.NETハンドラーではコンパイル結果はアセンブリが生成されるだけで、Web.Configファイルにアセンブリとそのオブジェクトを参照するハンドラーを登録します。
ASP.NETのサーバーにアクセスした際に、登録したハンドラーが処理され、オブジェクトが呼び出され、処理を実行してHTTPレスポンスを返します。
ASP.NETハンドラーを利用した場合はWeb.Configのハンドラーを変更することで対応するURLを変えることや、ワイルドカードを利用した複数のURLに対する処理ができます。
補足
ジェネリックハンドラーの詳細は
こちらの記事を参照してください。
| ASP.NETハンドラー | ジェネリックハンドラー | 補足 |
生成されるファイル | *.cs | *.ashx + *.ashx.cs | VBの場合は *.vb |
Web.Configへのハンドラー登録 | 必要 | 不要 | |
複数のURLの処理ができるか | ワイルドカードを利用できる | 不可 | ジェネリックハンドラーでもURL Routingを利用すれば対応できる |
実装手順
プロジェクトの作成
ASP.NETアプリケーションを新規作成します。
[新しいASP.NET Web アプリケーション]ダイアログでは[空]の項目を選択します。
空のASP.NET Webアプリケーションが作成されました。
App_Code ASP.NETフォルダの作成
ソリューションエクスプローラーでプロジェクトのノードをクリックして選択します。選択後右クリックしポップアップメニューを表示します。メニューの[追加]の[ASP.NETフォルダーの追加]サブメニューの[App_Code]をクリックします。
App_Codeフォルダが追加されます。
ASP.NET ハンドラの作成
ソリューションエクスプローラーの[App_Code]フォルダをクリックして選択し右クリックします。ポップアップメニューが表示されますので、[追加]メニューの[新しい項目]サブメニューをクリックします。
[新しい項目の追加]ダイアログが表示されます。
左側のツリービューの[Web]のノードをクリックして選択します。下図の表示に切り替わります。
[ASP.NET ハンドラー]の項目をクリックして選択します。
ダイアログ下部の[名前]欄のテキストボックスにファイル名を入力します。今回は"ExampleIISHandler.cs"とします。入力後ダイアログ右下の[追加]ボタンをクリックします。
ExampleIISHandler.cs ファイルが追加されます。
[IHttpHandler Members]の[+]アイコンをクリックすると折りたたまれていたIHttpHandlerのメソッドの実装コードが展開されて表示されます。
コード : ASP.NET ハンドラーの実装
"ExampleIISHandler.cs" ファイルに下記のコードを実装します。実質はProcessRequest()メソッド内のコードを記述するのみです。
using System;
using System.Web;
namespace SimpleAspNetHandler.App_Code
{
public class ExampleIISHandler : IHttpHandler
{
/// <summary>
/// ハンドラーを使用するには、Web の Web.config ファイルでこの
/// ハンドラーを設定し、IIS に登録する必要があります。詳細については、
/// 次のリンクをご覧ください: https://go.microsoft.com/?linkid=8101007
/// </summary>
#region IHttpHandler Members
public bool IsReusable
{
// マネージ ハンドラーが別の要求に再利用できない場合は、false を返します。
// 要求ごとに保存された状態情報がある場合、通常、これは false になります。
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
HttpRequest Request = context.Request;
HttpResponse Response = context.Response;
Response.Write("<html>");
Response.Write("<body>");
Response.Write("<h1>Hello ASP.NET handler.</h1>");
Response.Write("</body>");
Response.Write("</html>");
}
#endregion
}
}
コードの解説
下記のコードがASP.NETハンドラーが呼び出された際に処理を実行するメソッドになります。
Webブラウザーからのリクエスト情報を取得するHttpRequestは
HttpRequest Request = context.Request;
により取得できます。また、WebブラウザーへのレスポンスをするためのHttpResponseオブジェクトは
HttpResponse Response = context.Response;
により取得します。
今回の例では、HttpResponseオブジェクトのWriteメソッドを呼び出し、シンプルなHTML(h1タグで"Hello ASP.NET handler."の文字列を表示する)を返却しています。
public void ProcessRequest(HttpContext context)
{
HttpRequest Request = context.Request;
HttpResponse Response = context.Response;
Response.Write("<html>");
Response.Write("<body>");
Response.Write("<h1>Hello ASP.NET handler.</h1>");
Response.Write("</body>");
Response.Write("</html>");
}
ハンドラーの登録
Web.ConfigにASP.NETハンドラーを登録します。Web.Configファイルを下記に変更します。
<?xml version="1.0" encoding="utf-8"?>
<!--
ASP.NET アプリケーションの構成方法の詳細については、
https://go.microsoft.com/fwlink/?LinkId=169433 を参照してください
-->
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.7.1"/>
<httpRuntime targetFramework="4.7.1"/>
</system.web>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"/>
</compilers>
</system.codedom>
<system.webServer>
<handlers>
<add verb="*" path="*.test" name="ExampleIISHandler" type="SimpleAspNetHandler.App_Code.ExampleIISHandler"/>
</handlers>
</system.webServer>
</configuration>
解説
Web.Configファイルで追記するコードは下記になります。
verb
はハンドラーで対応するアクションになります。今回はすべてのアクション(動詞)に対応するため"*"とします。GETのみ、POSTのみに対応する場合は
verb
の値を"GET"や"POST"にします。
path
はハンドラーが処理するURLのパスになります。今回は"*.test"のパターンに一致するURLを登録するハンドラーで処理します。
name
はこのハンドラーを識別するための名称を設定します。プログラム的に参照されない値のため任意の値、または省略しても構いません。
type
はハンドラーにより呼び出されるオブジェクトを設定します。今回実装したExampleIISHandlerクラスを指定します。ExampleIISHandlerクラスはApp_Codeフォルダ内にあり、namespaceの値が"SimpleAspNetHandler.App_Code"となっていますので、typeに設定する値は
SimpleAspNetHandler.App_Code.ExampleIISHandler
となります。
以上の記述により、WebブラウザがWebアプリケーションの *.test のURLにアクセスすするとExampleIISHandlerのProcessRequest()メソッドが呼び出される動作となります。
<system.webServer>
<handlers>
<add verb="*" path="*.test" name="ExampleIISHandler" type="SimpleAspNetHandler.App_Code.ExampleIISHandler"/>
</handlers>
</system.webServer>
実行結果
プロジェクトを実行します。Webブラウザが起動し下図の画面が表示されます。ドキュメントルート
http://localhost:65213
にはファイルが何もなく、ハンドラーの対象でもないためFine Not Foundのエラー画面が表示されます。
http://localhost:65213/aaa.test
にアクセスします。"*.test"のパターンに一致するため、ASP.NETハンドラーの処理により、"Hello ASP.NET handler."の文字列が表示されるHTMLが返されます。
http://localhost:65213/bbb.test
にアクセスした場合も "*.test" のパターンに一致しますので、同様に、"Hello ASP.NET handler."の文字列が表示されるHTMLが返されます。
以上で、ASP.NETハンドラーの実装ができました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2018-05-25