.ashxファイル宛ての処理をHTTPハンドラ実装クラスへまわしてみる

どっとねっとふぁんさんの
22.サーバ上で画像を生成して表示するで.ashxという拡張子のファイルについて説明されています。

IHttpHandlerを実装したファイルを.ashxという拡張子をつけて保存するようです。
JavaServletと同じ感覚で使え、ファイルのダウンロードなどに使えそうです。


.ashxの拡張子のファイルがなくてもできるようです。
(Web.configに<httpHandlers>の設定が必要な分、不便で意味がないような気もしますが・・・)

ashx宛ての処理を、別プロジェクトで作ったアセンブリに委譲する方法

<httpHandlers>でIHttpHandler実装クラスを、ashxの拡張子をもつファイルとしてマッピングする方法
プログラミング Microsoft .NET ASP.NETによるサーバーサイド開発 (マイクロソフト公式解説書)
の440ページ付近に、ashxファイルのことがちょこっとのっていたので参照しました。

1:まず、以下のファイルをコンパイルし、ashxlib.dllというアセンブリファイルを生成します。


using System;
using System.IO;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;

namespace ashxlib
{
/// <summary>
/// 現在時刻をJpegイメージとして返す。
/// どっとねっとふぁん さんのページから
/// http://homepage3.nifty.com/dotnetfan/web/web22.html
/// </summary>
public class MyImage : IHttpHandler
{
public bool IsReusable
{
get
{
return(true);
}
}
public void ProcessRequest(HttpContext context)
{
using(Bitmap bmp = new Bitmap(250, 50))
using(Graphics g = Graphics.FromImage(bmp))
{
g.FillRectangle(Brushes.Blue, 0, 0, 250, 50);
using(Font f = new Font("MS ゴシック", 20))
{
string str = DateTime.Now.ToString("yyyy/MM/dd HH:mm");
g.DrawString(str, f, Brushes.Yellow, 10, 10);
}
context.Response.ContentType = "image/JPEG";
bmp.Save(context.Response.OutputStream,ImageFormat.Jpeg);
}
}
}


/// <summary>
/// 現在時刻を返すイメージを表示するhtmlを返す
/// </summary>
public class ShowImageHtml : IHttpHandler
{
public bool IsReusable
{
get
{
return(true);
}
}
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/HTML";
string str = DateTime.Now.ToString("yyyy/MM/dd HH:mm");

TextWriter output = context.Response.Output;
     output.WriteLine(@"<html>
<head>
<title>ShowImage</title>
</head>
<body>
現在時刻は<br />
<img src='TimeImage.ashx' alt='" +str+ @"' /><br />
です
</body>
</html>" );
}
}
}

2:Webアプリケーションの「bin」フォルダに「ashx.lib」ファイルをコピーします。
3:「Web.config」ファイルの<system.web>下に以下の記述を追加します。
    >httpHandlers<
	  >add verb="*" path="TimeImage.ashx" type="ashxlib.MyImage,ashxlib" /<
	  >add verb="*" path="ShowPresentTime.ashx" type="ashxlib.ShowImageHtml,ashxlib" /<
    >/httpHandlers<

4:http://localhost/仮想フォルダ名/ShowPresentTime.ashx

とすると、html内に時間のイメージが表示されます。
先ほどのMyImageクラスとShowImageHtmlが正しく呼び出されていることが確認できます。


???使い道なんてあるんだろうか???