在牛腩新闻系统中,牛老师带着我们学习了如何使用一般处理程序生成验证码,在这个过程中也纠结了不少时间,自己跟着牛老师的步骤,按部就班的进行,结果我的验证码始终不能显示出来,在刘杰的帮助下2分钟就解决了,对于他的解决过程我要反思一下,如果有这些纠结的时间自己多找资料了解一下什么是一般处理程序,应该早就解决了,一味的看视频忘了思考。牛腩新闻系统早就完成了,在看后面的视频中感觉对于牛腩中的东西还要认真的总结一下,在这个基础上在继续后面的学习可能会更好些,这篇博客我们一起学习一下什么是一般处理程序。
一、基础知识了解:
一般处理程序(后缀为.ashx),类似于Web窗体(后缀为.aspx),一般的Web窗体能够处理外部传入的请求,把这个请求自动生成一个HTML返回外部。而一般处理程序就是为了满足我们既能像普通Web窗体一样处理一般请求,同样也能根据我们的需要自定义传入的请求处理方式,与Web窗体不同的是他没有界面层,可以看成是一个单独了类。
二、一般处理程序的添加:
右键项目——新建项——选择一般处理程序:
如图,默认添加的一般处理程序的同时会自带一个后缀为.ashx.cs的文件:
到此我们就要重点说一说这个后缀为.ashx.cs的文件怎么回事,如果我们把代码写在这个文件里面,我们的程序当然不能运行成功了。
后缀为.ashx.cs是一般处理程序的后台代码,当我们运行到这个一般处理程序的时候他会自动跳到这个文件中执行该文件中的代码,不涉及到前台界面,如图:
对应的该文件的代码为:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace 牛腩新闻发布系统.handler { /// <summary> /// Handler1 的摘要说明 /// </summary> public class Handler1 : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; context.Response.Write("Hello World"); } public bool IsReusable { get { return false; } } } }
由上面的代码可以看出一般处理程序实现了IHttpHandler接口的处理程序类,(关于这个接口的作用有好多,既可以处理ASP.NET页面,也可以处理Http请求,这部分的学习以后再说)它不需要继承Page类,所以不需要处理更多的事件,所以运行起来快速,比普通窗体更加节省系统资源。
下面就是生成验证码的代码:
<%@ WebHandler language="C#"Class="WaterMark"%>
/* * 创建人:肖红 * 创建时间:2014-6-5 * 版权所有:肖红 */ using System; using System.Web; using System.Drawing; using System.Drawing.Drawing2D; using System.Web.SessionState; public class WaterMark : IHttpHandler ,IRequiresSessionState // 要使用session必须实现该接口,记得要导入System.Web.SessionState命名空间 { public void ProcessRequest(HttpContext context) { string checkCode = GenCode(5); // 产生5位随机字符 context.Session["Code"] = checkCode; //将字符串保存到Session中,以便需要时进行验证 System.Drawing.Bitmap image = new System.Drawing.Bitmap(70, 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()); } finally { g.Dispose(); image.Dispose(); } } /// <summary> /// 产生随机字符串 /// </summary> /// <param name="num">随机出几个字符</param> /// <returns>随机出的字符串</returns> private string GenCode(int num) { string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char[] chastr = str.ToCharArray(); // string[] source ={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#", "$", "%", "&", "@" }; string code = ""; Random rd = new Random(); int i; for (i = 0; i < num; i++) { //code += source[rd.Next(0, source.Length)]; code += str.Substring(rd.Next(0, str.Length), 1); } return code; } public bool IsReusable { get { return false; } } }
我们在界面的HTML中用Image查看即可:
<p>验证码:<img src ="../handler/WaterMark.ashx"id="vimg"alt=""onclick="changeCode()"/>
在这里对于单击图片就可以进行刷新的功能,我们采用的是利用javascript编写changeCode()方法:
此时刷新验证码就可以成功的显示了。详细的讲解一般处理程序我们以后还会继续,因为一般处理程序的应用挺频繁的,对于一些程序的处理结果不返回界面的HTML请求,我们都可以采用一般处理程序完成,例如RSS Feed、XML、验证图片等。