理解HttpHandler,并为所有*.jpg图片生成一段文字于图片上

  接口IHttpHandler的定义如下:

  

复制代码 代码如下:

  interface IHttpHandler

  {

  void ProcessRequest(HttpContext ctx);

  bool IsReuseable { get; }

  1新建一网站,名为MyHttpHandlerTest

  2右击添加,选择类库,取名为MyHttpHandler

  3-在上一步新建的类库上右键添加System.Web引用

  主要代码:

  

复制代码 代码如下:

  using System;

  using System.Collections.Generic;

  using System.Text;

  using System.Web;

  using System.Web.SessionState;

  namespace MyHttpHandler

  {

  public class Class1:IHttpHandler,IRequiresSessionState

  {

  #region IHttpHandler成员

  public bool IsReusable

  {

  get { return true; }

  }

  public void ProcessRequest(HttpContext context)

  {

  context.Response.Write("handler处理");

  }

  #endregion

  }

  }

  4-在MyHttpHandler类库上右键,生成,取名为MyHttpHandler

  5-在web.config中的system.web节点中天下如下节点

  <httpHandlers>

  <add verb="*" path="Handler1.aspx" type="MyHttpHandler.Class1,MyHttpHandler"/>

  <!--

  配置文件中的选项说明:

  · verb可以是"GET"或"POST",表示对GET或POST的请求进行处理。"*"表示对所有请求进行处理。

  · Path指明对相应的文件进行处理,"*.aspx"表示对发给所有ASPX页面的请求进行处理。可以指明路径,如"/test/*.aspx",表明只对test目录下的ASPX文件进行处理。

  · Type属性中,逗号前的字符串指明HttpHandler的实现类的类名,后面的字符串指明Dll文件的名称。

  格式如:type="自定义HttpHandler的实现类的全名,自定义HttpHandler的实现类的命名空间(即Dll名)"

  或 type="自定义HttpHandler的实现类的全名"

  -->

  </httpHandlers>

  6-在MyHttpHandlerTest右键添加引用,选择项目找到刚才编译后的.dll文件

  7-运行Handler1.aspx,页面显示:

理解HttpHandler,并为所有*.jpg图片生成一段文字于图片上

  下面我们利用HttpHandler将一段文字生成于图片中

  添加一个类,默认为Class.cs

  

复制代码 代码如下:

  using System;

  using System.Collections.Generic;

  using System.Text;

  using System.Web;

  using System.Web.SessionState;

  using System.Drawing;

  /// <summary>

  /// Class1 的摘要说明

  /// </summary>

  public class Class1:IHttpHandler

  {

  public Class1()

  {

  //

  // TODO: 在此处添加构造函数逻辑

  //

  }

  public bool IsReusable

  {

  get { return true; }

  }

  private static Image OldImage = null;

  private static Image GetOldImage(HttpContext context)

  {

  if (OldImage == null)

  {

  OldImage = Image.FromFile(context.Server.MapPath("~/Images/Old.jpg"));

  }

  return OldImage.Clone() as Image;

  }

  public void ProcessRequest(HttpContext context)

  {

  Image newimage = GetOldImage(context);

  Graphics gh = Graphics.FromImage(newimage);

  Font font = new Font("Monaco", 24.0f, FontStyle.Regular);

  string writetext = HttpUtility.UrlEncode(context.Request.QueryString["writetext"]);

  gh.DrawString(HttpUtility.UrlDecode(writetext), font, new SolidBrush(Color.LightBlue), 20.0f, newimage.Height - font.Height - 30);

  newimage.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);

  gh.Dispose();

  newimage.Dispose();

  }

  }

  新建一个.aspx页面,添加一个HyperLink控件,再在其.cs文件中添加一段代码传值

  

复制代码 代码如下:

  protected void Page_Load(object sender, EventArgs e)

  {

  HyperLink1.NavigateUrl = "img.jpg?writetext=" + HttpUtility.UrlEncode("大蜗牛");

  }

  另外还需在web.config文件中将httpHandlers节点中改为如下

  <add verb="*" path="*.jpg" type="Class1"/>

  表明对所有的.jpg格式的文件才会处理

  参考《道不远人 深入解析asp.net 2.0控件开发》