.ashxファイル宛ての処理をHTTPハンドラ実装クラスへまわしてみる
どっとねっとふぁんさんの
22.サーバ上で画像を生成して表示するで.ashxという拡張子のファイルについて説明されています。
IHttpHandlerを実装したファイルを.ashxという拡張子をつけて保存するようです。
JavaのServletと同じ感覚で使え、ファイルのダウンロードなどに使えそうです。
.ashxの拡張子のファイルがなくてもできるようです。
(Web.configに<httpHandlers>の設定が必要な分、不便で意味がないような気もしますが・・・)
ashx宛ての処理を、別プロジェクトで作ったアセンブリに委譲する方法
<httpHandlers>でIHttpHandler実装クラスを、ashxの拡張子をもつファイルとしてマッピングする方法
の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が正しく呼び出されていることが確認できます。
???使い道なんてあるんだろうか???