理解并自定义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防止图片盗链的实例,很实用哦!
- 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 数组属性和方法
- JDK 中的栈竟然是这样实现的?
- 谈一谈如何在Python开发中拒绝SSRF漏洞
- eval长度限制绕过 && PHP5.6新特性
- Cookie-Form型CSRF防御机制的不足与反思
- Python 格式化字符串漏洞(Django为例)
- unity官方案例精讲(第三章)--星际航行游戏Space Shooter
- Pwnhub Web题Classroom题解与分析
- WTForm的URLXSS谈开源组件的安全性
- 谈一谈复杂的正则表达式分析
- Linux 用户名、主机添加背景色
- percona-toolkit大表操作DDL使用 2.1. 数据库字符集修改2.2. 数据库建库、授权操作2.3. 数据库建表、插入数据4.1. 添加表字段【
- PHPMailer 代码执行漏洞(CVE-2016-10033)分析(含通用POC)
- linux 平均负载 load average 的含义【转】
- zookeeper-01 概述
- zookeeper-02 部署