Web Tips22で作成したashxファイルですが、このままではSessionオブジェクトに格納した値を取り出すことができません。
入力された内容によって画像を変更しようという場合、imgタグのsrc属性にクエリーストリングを追加するという方法もありますが、ここではashxファイルでSessionを取得できるようにしてみます。
MyImage1.ashx
-------------------------------------------------------
<%@ WebHandler language="C#" class="MyImage" %>
using System;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
public class MyImage:IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
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 = (string)context.Session["str"];
g.DrawString(str, f, Brushes.Yellow, 10, 10);
}
context.Response.ContentType = "image/JPEG";
bmp.Save(context.Response.OutputStream,ImageFormat.Jpeg);
}
}
}
-------------------------------------------------------
必要なことは、作成したクラスでSystem.Web.SessionState.IRequiresSessionStateインタフェースも継承させることだけです。
これだけで、
string str = (string)context.Session["str"];
といった形でSessionオブジェクトから値を取り出すことが可能になります。
このMyImage1.ashxファイルを呼び出すのは、以下のようなファイルになります。
sample.aspx
-------------------------------------------------------
<%@ Page language="c#" %>
<script runat="server">
void button1_Click(Object sender, EventArgs e)
{
Session["str"] = intxt.Text;
Image Image1 = new Image();
Image1.ImageUrl = "MyImage1.ashx";
PlaceHolder1.Controls.Add(Image1);
}
</script>
<html>
<body>
<form method="post" runat="server">
<asp:Textbox id="intxt" runat="server"/>
<asp:Button id="Button1" Text="画像作成" OnClick="button1_Click" runat="server"/>
<br />
</form>
<asp:PlaceHolder id="PlaceHolder1" runat="server" /><br />
</body>
</html>
-------------------------------------------------------
テキストボックスに文字を入力してボタンをクリックすると、テキストボックスの下に画像が表示されます。
このサンプルでは画像の大きさが固定なので、文字列が長いと途中で切れてしまいますが、そのあたりは工夫してみてください
あおい情報システム株式会社 小野修司(どっとねっとふぁん)