HttpHandler 可以直接写入一个 .ashx 而不需要被编译。顺便说下ashx 文件是用于写web handler的。一般用来处理生成动态图片、生成动态文本等不需要回传处理的任务。OK,不多废话,步入正题。下面在 .ashx 中构造一个图像生成器来创建校验码,它用来防止 Web 应用程序中的自动注册。先看代码:
Image.ashx:
<%@ WebHandler Language="C#" CodeBehind="Image.ashx.cs" Class="HttpHandlerDemo.Image" %> |
Image.ashx.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Drawing; using System.Text; using System.Drawing.Imaging;
namespace HttpHandlerDemo { /// <summary> /// 图像生成器,用于创建图片校验码 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class Image : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "image/gif"; Bitmap b = new Bitmap(200, 60); Graphics g = Graphics.FromImage(b); g.FillRectangle(new SolidBrush(Color.White), 0, 0, 200, 60); Font font = new Font(FontFamily.GenericSerif, 48, FontStyle.Bold, GraphicsUnit.Pixel); Random r = new Random(); string letters = "ABCDEFGHRJKLMNOPQRSTUVWXYZ"; string letter; StringBuilder s = new StringBuilder(); //随机生成字母,基于字母使用 Graphics 类生成位图 for (int i = 0; i < 5; i++) { letter = letters.Substring(r.Next(0, letters.Length - 1), 1); s.Append(letter); g.DrawString(letter, font, new SolidBrush(Color.Black), i * 38, r.Next(0, 16)); }
//在已生成的随机字母位图上画随机线条 Pen linePen = new Pen(new SolidBrush(Color.Black), 2); for (int i = 0; i < 6; i++) { g.DrawLine(linePen, new Point(r.Next(0, 199), r.Next(0, 59)), new Point(r.Next(0, 199), r.Next(0, 59))); } b.Save(context.Response.OutputStream, ImageFormat.Gif); //context.Session["pfregisterimage"] = s.ToString(); context.Response.End(); }
public bool IsReusable { get { return true; } } } } |
生成效果图
主要操作都是在 ProcessRequest() 方法中完成的。首先随机生成一个五个字母的字符串,基于这些字母使用 Drawing 命名空间下的各个类生成位图,将字母随机摆放。然后在位图上画一些随机线条,使计算机难以识别。
最终将图片以 GIF 文件的形式保存并发总给 Response 对象的 OutputStream 。 可以将随机生成的字母保存到 Session 中,当用户输入完验证码,窗体会送时,将 Session 中的值和用户的输入比较,确认用户是人工输入。