理解并自定义HttpHandler
前言
之前从网上找了几篇讲解如何自定义HttpHandler的文章,依葫芦画瓢却一直没成功过。经过上一篇《asp.net管道模型(管线模型)之一发不可收拾》的总结,对管道模型和请求/响应过程有进一步的了解后,再结合Asp.Net 构架(Http Handler 介绍) - Part.2后终于成功定义自己的HttpHandler和HttpHandlerFactory了^_^、
本文有些地方会跟《asp.net管道模型(管线模型)之一发不可收拾》有些重叠,但角度会有所不同,两篇文章相互补充,希望能完整地呈现管道模型的全貌。
目录
1.发送Default.aspx时默认得到相应HttpHandler的过程;
2.如何配置;
3.自定义HttpHandler;
4.自定义HttpHandlerFactory;
5.应用实例。
发送Default.aspx时默认得到相应HttpHandler的过程
IIS下有一个metabase文件,可通过网站—》属性—》主目录—》配置—》映射中添加、修改、删除。
图1
IIS会检查请求文件是否在metabase文件中有对应的处理应用程序。default.aspx对应的是Aspnet_ISAPI.exe来处理(所以执行文件路径为Aspnet_ISAPI.exe的文件均由它处理),然后Aspnet_ISAPI.exe就把请求转发到Asp.net工作进程。跳到管道模型的HttpApplication中(之前还有很多步骤,这里着重讲解HttpApplication后面的步骤),HttpApplication根据Url的后缀名调用相应的HttpHandlerFactory(默认情况下.aspx调用System.Web.UI.PageHandlerFactory,.ashx调用System.Web.UI.SimpleHandlerFactory),然后HttpHandlerFactory在生成default.aspx具体的HttpHandler实例。
如何配置
之前一直迷失在如何配置的问题上,这里先说明白吧!
下面是自定义HttpHandler时配置的根据:
IIS进行第一次筛选,HttpApplication进行第二次筛选。所以
1.自定义时要配置IIS让它把对应的文件后缀映射到Asp_ISAPI.exe来处理;
2.在应用程序级web.config中配置<HttpHandlers>节点使HttpApplication能根据配置把请求交由相应的HttpHandlerFactory或HttpHandler处理。
具体web.config配置:
1 <handlers>
2 <add verb="*" path="*.myhandler" type="My.MyHandler,MyAssembly"/>
3 </handler>
verb:请求动作(get,post,*);
path:文件路径(*通配符);
type:,前的参数为自定义HttpHandler或HttpHandlerFactory的完整类名(含命名空间),,后的参数为自定义HttpHandler或HttpHandlerFactory所在的程序集名(不含dll后缀)。
自定义HttpHandler
定义一个继承IHttpHandler接口的类并实现接口的方法:
1 public class MyHandler:IHttpHandler
2 {
3 public MyHandler()
4 {
5 }
6
7 public void ProcessRequest(HttpContext context)
8 {
9 context.Response.ContentType = "text/html";
10 context.Response.Write("MyHandler");
11 }
12
13 public bool IsReusable
14 {
15 get { return true; }
16 }
17 }
1.ProcessRequest方法就是具体处理请求的地方;
2.IsReusable标识该HttpHandler类的实例对象是否可重用。就是当第一个请求发送过来时,实例化一个HttpHandler实例对象,如果IsReusable为true,那么第二个请求发送过来时就可以用回该实例对象而不用重新构造一个,如果为false就要重新构造一个实例。(有点啰嗦了(*^__^*) 嘻嘻……)一般返回true,提高效率嘛!!
web.config中配置
1 <Handlers>
2 <add verb="*" path="*.gif" type="MyHandler,MyHandler"/>
3 </Handlers>
IIS中配置,在图1中添加一项映射项,扩展名为.gif,可执行文件路径为C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_isapi.dll,动作为全部动作,然后把“确定文件是否存在”的复选框取消选中(如果选中了,就必须由对应的文件存在才能处理,如url为a.gif,就必须有a.gif文件真实存在,否则就返回404)。
注意:自定义的HttpHandler必须放在其他项目工程中,然后引用到Web项目中,也就是说配置文件中的type的程序集名称必须写,否则无法执行。
自定义HttpHandlerFactory
定义一个继承IHttpHandlerFactory接口的类并实现接口的方法:
1 public class MyHandlerFactory:IHttpHandlerFactory
2 {
3 public MyHandlerFactory()
4 {
5 }
6
7 #region IHttpHandlerFactory 成员
8
9 public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
10 {
11 return new MyHandler();
12 }
13
14 public void ReleaseHandler(IHttpHandler handler)
15 {
16 throw new NotImplementedException();
17 }
18
19 #endregion
20 }
1.GetHandler获取新的具体的HttpHandler实例;
2.ReleaseHandler使工厂可以重用现有的处理程序实例。
web.config中配置
1 <Handlers>
2 <add verb="*" path="*.gif" type="MyHandlerFactory,MyHandlerFactory"/>
3 </Handlers>
这里不用配置MyHandler。
IIS中配置,在图1中添加一项映射项,扩展名为.gif,可执行文件路径为C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_isapi.dll,动作为全部动作,然后把“确定文件是否存在”的复选框取消选中(如果选中了,就必须由对应的文件存在才能处理,如url为a.gif,就必须有a.gif文件真实存在,否则就返回404)。
应用实例
Asp.Net 构架(Http Handler 介绍) - Part.2中有一个使用HttpHandler防止图片盗链的实例,很实用哦!
- “家庭贷款”域名Home.loans已经建站为家庭贷款相关的网站
- 微信亿级用户异常检测框架的设计与实践
- 程序员必知的6点编程秘诀,编程三板斧将解决90%问题!
- JavaScript之面向对象学习三原型语法升级
- 腾讯入局物业管理,欲改造传统服务?
- JavaScript之面向对象学习五(JS原生引用类型Array、Object、String等等)的原型对象介绍
- SQL学习之分组数据Group by
- SQL学习之数据列去空格函数
- 采用DIV+CSS布局对SEO优化有何好处?
- Sublime快速入门
- SQL学习之汇总数据之聚集函数
- Sedo榜单中,域名“加密世界”CryptoWorld.com七位数夺冠
- ExtJs学习笔记(20)-利用ExtJs的Ajax与服务端WCF交互
- 2018年热点分享:比特币到底是什么?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 算法篇:二分法之k个数之和
- 记一次循环依赖踩坑
- 为什么大家都说 SELECT * 效率低
- 一些恶心的代码片段,吐了....
- 大数据入门:Spark+Kudu的广告业务项目实战笔记(二)
- 给女同事讲完代理后,女同事说:你好棒哦
- 为什么我要从 Windows 切换到 Linux?
- 大白话带你认识 ZooKeeper !重要概念一网打尽!
- 如何在 Node.js 中判断一个文件是否存在?
- 我参与了两个接近100k+star的开源项目!聊聊开源项目贡献指南
- 最新更新 | Kafka - 2.6.0版本发布新特性说明
- 利用Libra进行机器学习和深度学习
- I2C总线架构 之 总线驱动
- 一文讲透“布隆过滤器”
- 基于PySpark的流媒体用户流失预测