httpHandlers和httpModules接口介绍 (4)
Web.Config配置文件
|
Verb属性:指定了处理程序支持的HTTP动作。*-支持所有的HTTP动作;“GET”-支持Get操作;“POST”-支持Post操作;“GET, POST”-支持两种操作。
Path属性:指定了需要调用处理程序的路径和文件名(可以包含通配符)。“*”、“*.aspx”、“showImage.aspx”、“test1.aspx,test2.aspx”
Type属性:用名字空间、类名称和程序集名称的组合形式指定处理程序或处理程序工厂的实际类型。ASP.NET运行时首先搜索bin目录中的DLL,接着在GAC中搜索。
这样程序运行的效果是该网站的任何一个页面都会显示worm.jpg图片。如何只让一个页面(default21.aspx)执行HttpHandler中的ProcessRequest方法呢?最简单的办法是在Web.Config文件中把path配置信息设为default21.aspx。
根据这个例子大家可以考虑一下如何编写“验证码”了。
IHttpHandler工厂 IHttpHandlerFactory的作用是对IHttpHandler进行管理。 工厂的作用请见 http://hi.baidu.com/grayworm/blog/item/4a832160f8c9de46eaf8f8c1.html" IHttpHandlerFactory接口的声明: public interface IHttpHandlerFactory { IHttpHandler GetHandler (HttpContext context,string requestType,string url,string pathTranslated); void ReleaseHandler (IHttpHandler handler); } |
GetHandler返回实现IHttpHandler接口的类的实例,ReleaseHandler使工厂可以重用现有的处理程序实例。
示例:两个用IHttpHandlerFactory来实现对不同HttpHandler的调用。
有两个HttpHandler:将图片显示在页面上的HttpHandler和生成验证码的Handler
//将图片显示在页面上的Handler
class TestHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { FileStream fs = new FileStream (context.Server.MapPath("worm.jpg"), FileMode.Open); byte[] b = new byte[fs.Length]; fs.Read(b, 0, (int)fs.Length); fs.Close(); context.Response.OutputStream.Write(b, 0, b.Length); } public bool IsReusable { get { return true; } } } //生成验证码的Handler class CodeHandler:IHttpHandler { public bool IsReusable { get { return true; } } public void ProcessRequest(HttpContext context) { Image b = new Bitmap(50,20); Graphics g = Graphics.FromImage(b); SolidBrush sb = new SolidBrush(Color.White); Font f = new Font("宋体", 12); string str = ""; Random r = new Random(); for (int i = 0; i < 4; i++) { str += r.Next(10); } g.DrawString(str,f,sb,0,0); b.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); } } |
"唯有高屋建瓴,方可水到渠成"