シンプルなASP.NET ハンドラーを作成する - ASP.NET

シンプルな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.csVBの場合は *.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()メソッド内のコードを記述するのみです。
ExampleIISHandler.cs
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ファイルを下記に変更します。
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=\&quot;Web\&quot; /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
iPentec all rights reserverd.