ASP.NET で HTTP ハンドラーを作成する

以前に投稿した静的コンテンツへの要求を動的に処理するという記事に関連して、
今回は HTTP ハンドラーを作成する方法を紹介します。

ASP.NET で HTTP 要求に対して応答を返す方法としては、
IHttpHandler インターフェイスを実装したクラスを作成する方法があり、
.aspx や MVC を使うよりも原始的です (最も原始的な方法は Global.asax)。
ProcessRequest メソッドの引数で HttpContext オブジェクトが渡されます。
HTTP 要求の情報はここからすべて取得でき、応答もこのオブジェクトに格納します。
これにより、任意の処理を実装できます。

IHttpHandler インターフェイスを利用する方法として、
.ashx ファイルを作成する方法もありますが、これでは拡張子が .ashx に固定されてしまいます。
任意の拡張子を利用するには、通常のクラスとして IHttpHandler インターフェイスを実装し、
Web.config で拡張子や HTTP メソッド (GET など) とのマッピングを指定します。

以下では、.txt へのアクセスに対する HTTP ハンドラーを実装します。

using System;
using System.IO;
using System.Web;
public class TextHandler : IHttpHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
var fileName = Path.GetFileNameWithoutExtension(context.Request.Path);
var text = string.Format("The file name is {0}.", fileName);
context.Response.ContentType = "text/plain";
context.Response.Write(text);
}
}
view raw TextHandler.cs hosted with ❤ by GitHub
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
</system.web>
<system.webServer>
<handlers>
<add name="TextHandler" verb="GET" path="*.txt" type="TextHandler"/>
<add name="PngHandler" verb="GET" path="Colors/*.png" type="PngHandler"/>
</handlers>
</system.webServer>
</configuration>
view raw Web.config hosted with ❤ by GitHub

サンプルの全体は HttpHandlerWeb (GitHub) にあります。
なお、このサンプルでは Web アプリケーション プロジェクトではなく、Web サイトを利用しています。
そのため、App_Code フォルダーの下にクラスを配置しています。

これで、.txt へのアクセスを受け付けられるようになりました。

file1.txt

 

以前のバージョン (IIS 6.0 以前?) では、Web.config の system.web/httpHandlers セクションで設定していました。

<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpHandlers>
<add verb="GET" path="*.txt" type="TextHandler" />
<add verb="GET" path="Colors/*.png" type="PngHandler" />
</httpHandlers>
</system.web>
</configuration>
view raw Web.config hosted with ❤ by GitHub

 

前回:静的コンテンツへの要求を動的に処理する

作成したサンプル
HttpHandlerWeb (GitHub)

バージョン情報
.NET Framework 4.5

参照
チュートリアル : 同期 HTTP ハンドラーの作成 (MSDN)

カテゴリー: .NET Framework. タグ: . 1 Comment »

ランダムなデータを生成する JSON API

Random Data Web API というものを作成しました (正確には、2014 年に作成したものを最近改修しました)。
ランダムなデータを生成するための JSON Web API です。以下のデータを生成できます。

  • アルファベット
  • アルファベットと数字
  • バイト列
    • 16進数形式、Base64 形式
  • UUID (GUID)
  • 時刻順の ID
    • 現在の時刻をもとに、並べ替え可能な GUID を生成
    • SQL Server の uniqueidentifier 型にも対応

内容自体はとくに変哲のない API です。時刻順の ID は少し珍しいかもしれませんが。
また、仕様が記述されたヘルプページ、および jQuery を利用したテストページが付属しています。

Test page

さて、従来の一般的な Web API の問題点として、利用する開発者の意思に反してサービスが終了してしまうということがよくあります。
無償・有償を問わずサービスが永久に提供されるとは限らないため、
なるべく自身のアプリをそれに依存させず、自身でサービスを運用することが望ましいでしょう。

そこでこの Web API では、ソースコードをオープンソース ライセンスのもとで提供し、
それを利用する開発者自身がサービスをホストすることを想定します。
例えば Azure Web App などの PaaS を利用すれば GitHub から直接ビルドおよびデプロイができるため、
簡単な手順でサービスの運用を開始させることができます。
またこの場合は継続的デプロイが構成され、fork したリポジトリが更新されれば Azure Web App も自動的に更新されます。

詳細の方法については Azure Web App にデプロイする手順にまとめてあります。
なお、randomdata.azurewebsites.net は配置例として提供しているものです。このサイトに保証・サポートはありません。

Deployment Option

技術的な特徴としては、以下が挙げられます。

  • ASP.NET Web API
    • XML Formatter を無効化して、JSON 形式のみをサポート
  • ASP.NET Web API Help Page
    • ソースコード内のコメントから自動生成
    • いろいろカスタマイズして利用
  • ASP.NET Web API Cross-Origin Support
    • CORS (Cross-Origin Resource Sharing)
  • HTTPS 必須化

ヘルプページの多言語対応については、ブラウザーの翻訳機能を利用すれば何とかなるでしょう。

Help Translation

バージョン情報

  • .NET Framework 4.5
  • ASP.NET Web API 5.2.3
  • ASP.NET Web API Help Page 5.2.3
  • ASP.NET Web API Cross-Origin Support 5.2.3
  • Blaze 1.1.10

参照