C#生成中文汉字验证码的具体实现

      首先说一下生成验证码的文件格式不是用的.aspx,而是.ashx; 利用.ashx文件是一个更好的方法,这个文件类似于.aspx文件,可以通过它来调用HttpHandler类,从而免去了普通.aspx页面的控件解析以及页面处理的过程。这个文件特别适合于生成动态图片,生成动态文本等内容。

        .ashx 文件用于写web handler的。其实就是带HTML和C#的混合文件。当然你完全可以用.aspx 的文件后缀。使用.ashx 可以让你专注于编程而不用管相关的WEB技术。.ashx必须包含IsReusable.

<% @ webhandler language="C#" class="AverageHandler" %>

using System;
using System.Web;

public class AverageHandler : IHttpHandler
{
public bool IsReusable
{ get { return true; } }
public void ProcessRequest(HttpContext ctx)
{
ctx.Response.Write("hello");
}
}

.ashx比.aspx的好处在与不用多一个html   

注意了VS2005中Web应用程序项目模板里的Generic Handler 项,发现它是一个.ashx文件,实际上它是一个HttpHandler。后来查了一下.Net SDK文档,发现Asp.Net1.1也支持.ashx,但是没有给出详细内容。

我们都知道,HttpHandler是一个彻底自定义Http请求的方法,它通过web.config来定义Asp.Net运行时来过滤出要自定义的Http请求,发送到定义在web.config的指定类中。

建立方法如下:
首先打开一个Web项目,然后在任意目录下使用VS2003解决方案资源管理器的“添加”-->“添加新项”,在对话框中选择“文本文件”,然后在文件名处输入“CheckCode.ashx”。

然后在同目录下,使用解决方案资源管理器,使用“添加”-->“添加类”,在类文件名处输入“CheckCode.ashx.cs”。可以看出,它的文件命名规律与.aspx文件相同。

然后在.cs文件处输入以下代码(名称空间略):

using  System.Web
public sealed  class CheckCode : IHttpHandler
 {
  public CheckCode()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
//  public void ProcessRequest(HttpContext context)
//  {
//   context.Response.ClearContent();
//   context.Response.ContentType = "text/plain";
//   context.Response.Write("Hello World");
//   context.Response.End();
//  }
//
  public bool IsReusable
  {
   get { return true; }
//  }
  public void ProcessRequest(HttpContext context)
  {
   context.Response.Cache.SetCacheability(HttpCacheability.NoCache);///特别注意,如不加,单击验证图片'看不清换一张',无效果.
   this.CreateCheckCodeImage(GenerateCheckCode(context),context);
  }
  public bool IsReusable
  {
   get
   {
    return false;
   }
  }
  private string GenerateCheckCode(HttpContext context)
  {
   string str = "的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严";     //用于随机查取的汉字
   char[] chastr = str.ToCharArray();
   string code = "";
   Random rd = new Random();
   int i;
   for (i = 0; i < 4; i++)
   {
    //code += source[rd.Next(0, source.Length)];
    code += str.Substring(rd.Next(0, str.Length), 1);
   }
   context.Response.Cookies.Add(new HttpCookie("CheckCode", code));//你也可以存到Seesion里.
   return code;
  }
  private void CreateCheckCodeImage(string checkCode, HttpContext context)
  {
   if (checkCode.Trim() == "" || checkCode == null)
    return;
  System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)(checkCode.Length * 21.5), 22);
   Graphics g  = Graphics.FromImage(image);
   try
   {
    //生成随机生成器
    Random random = new Random();
    //清空图片背景色
    g.Clear(Color.White); 
    // 画图片的背景噪音线
    int i;
    for (i = 0; i < 25; i++)
    {
     int x1 = random.Next(image.Width);
     int x2 = random.Next(image.Width);
     int y1 = random.Next(image.Height);
     int y2 = random.Next(image.Height);
     g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
    }
    Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold));
    System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, true);
    g.DrawString(checkCode, font, brush, 2, 2);
    //画图片的前景噪音点
    g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
     context.Response.ClearContent();
     context.Response.ContentType = "image/Gif";
     context.Response.BinaryWrite(ms.ToArray());
   }
   catch
   {
    g.Dispose();
    image.Dispose();
   }

  }
}

然后在“CheckCode.ashx”文件的第一行处输入上面这个类的调用代码:

<% @ WebHandler language="C#" Class="MyNamespace.CheckCode" codebehind="CheckCode.ashx.cs"  %>

上面的代码需要注意的是:必须在Class项中输入类的完整名称,即包括名称空间及类名称。

最后保存并编译项目。

使用IE测试,输入这个.ashx的地址即可。

大家可以看出Response类有个OutputStream方法,可以向客户端输出二进制数据流,所以在我的项目中,使用这个方法,在一个.ashx中使用DundasChart控件就可以生成非常好的统计图,用它发送二进制数据,方便快捷,而且不需在web.config内输入任何配置代码。 

      到此,生成验证文件的代码已完成,就看怎么来调用了,其实调用的方法很简单,

<IMG src="CheckCode.ashx" οnclick="this.src='CheckCode.ashx'" title="看不清换一张">
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值