理解并自定义HttpHandler
前言
之前从网上找了几篇讲解如何自定义HttpHandler的文章,依葫芦画瓢却一直没成功过。经过上一篇《asp.net管道模型(管线模型)之一发不可收拾》的总结,对管道模型和请求/响应过程有进一步的了解后,再结合Asp.Net 构架(Http Handler 介绍) - Part.2后终于成功定义自己的HttpHandler和HttpHandlerFactory了^_^、
本文有些地方会跟《asp.net管道模型(管线模型)之一发不可收拾》有些重叠,但角度会有所不同,两篇文章相互补充,希望能完整地呈现管道模型的全貌。
目录
1.发送Default.aspx时默认得到相应HttpHandler的过程;
2.如何配置;
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:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_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:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll,动作为全部动作,然后把“确定文件是否存在”的复选框取消选中(如果选中了,就必须由对应的文件存在才能处理,如url为a.gif,就必须有a.gif文件真实存在,否则就返回404)。
应用实例
Asp.Net 构架(Http Handler 介绍) - Part.2中有一个使用HttpHandler防止图片盗链的实例,很实用哦!
如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!
理解并自定义HttpHandler的更多相关文章
- web form中自定义HttpHandler仿mvc
web form中自定义HttpHandler仿mvc 前言 在mvc大行其道的今天,仍然有不少公司的项目还是使用web form来实现的(其实mvc也是基于web form的),如果要在项目中引入m ...
- 深入理解Android 自定义attr Style styleable以及其应用
相信每一位从事Android开发的猿都遇到过需要自己去自定义View的需求,如果想通过xml指定一些我们自己需要的参数,就需要自己声明一个styleable,并在里面自己定义一些attr属性,这个过程 ...
- 自定义HttpHandler
1.创建自定义类型 2.继承IHttpHandler接口,并实现 3.配置Web.Config文件,注册类型 4.访问 public class QuickMsgSatisticsHandler : ...
- Java Serializable接口(序列化)理解及自定义序列化
1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反 ...
- 自定义HttpHandler配置iis8.0
配置环境,window8 ,iis8.0,.net Framework4.0,托管管道模式“经典” 步骤 (1)进入iis管理器,选中要设置的网站-->功能视图-->MIME类型--> ...
- 自定义 httpHandler 配置
开发 环境 vs2010.asp.net 4.0 时 写在<system.web> ,<httpHandlers>节点下 部署 环境Windows server 2007 , ...
- Asp.net管道模型(管线模型)
Asp.net管道模型(管线模型) 前言 为什么我会起这样的一个标题,其实我原本只想了解asp.net的管道模型而已,但在查看资料的时候遇到不明白的地方又横向地查阅了其他相关的资料,而收获比当初预 ...
- Asp.net管道模型(管线模型)之一发不可收拾
前言 为什么我会起这样的一个标题,其实我原本只想了解asp.net的管道模型而已,但在查看资料的时候遇到不明白的地方又横向地查阅了其他相关的资料,而收获比当初预想的大了很多. 有本篇作基础,下面两篇就 ...
- 理解AngularJS生命周期:利用ng-repeat动态解析自定义directive
ng-repeat是AngularJS中一个非常重要和有意思的directive,常见的用法之一是将某种自定义directive和ng-repeat一起使用,循环地来渲染开发者所需要的组件.比如现在有 ...
随机推荐
- 如何将CKeditor编辑器的上传和thinkphp结合
转载:THINKPHP代码中 lxepoo的文章 有时候我们会发现,我们需要对上传文件进行日志记录,这样的记录通常写在LOG文件或数据库中,那么,通过TP本身的上传类,可以实现的,但是只能做到编辑器外 ...
- java的if else语句入门
条件语句,是程序中根据条件是否成立进行选择执行的一类语句,这类语句在实际使用中,难点在于如何准确的抽象条件.例如实现程序登录功能时,如果用户名和密码正确,则进入系统,否则弹出“密码错误”这样的提示框等 ...
- C# ~ 从 XML 到 Linq 到 Linq to XML
.XML 可扩展标记语言 (Extensible Markup Language), 标记 (markup) 是关键部分,是标准通用标记语言 (Standard Generalized Markup ...
- CodeSnippet.info 开源说明 和 环境搭建 (第一版)
Github开源声明 本网站的代码开源,开源的目的如下 技术分享 希望业内同行贡献代码 希望能够让网站更加安全 开源地址: CodeSnippet开源地址 关于代码贡献 任何人都可以贡献代码,一般在 ...
- 【转】Android世界的Swift - Kotlin语言
最近Oracle又在和Google撕的厉害,才知道还有这么Kotlin在Android像Swift在Mac的地位一说. Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrains设计 ...
- Redis配置集群二(window)
第一篇那redis的基础命令都差不多讲了一遍了,这篇就将怎么配置集群了,最后要达到的效果是一台主redis,还有几台从的redis,每次数据都是同步的,当主redis挂掉了,那么就会从几台从redis ...
- Gym 100917J---dir -C(RMQ--ST)
题目链接 http://codeforces.com/gym/100917/problem/D problem description Famous Berland coder and IT mana ...
- Codeforces Round #369 (Div. 2)---C - Coloring Trees (很妙的DP题)
题目链接 http://codeforces.com/contest/711/problem/C Description ZS the Coder and Chris the Baboon has a ...
- 线程Thread的基础知识学习
一.线程的基本概念 1.线程是一个程序内部的顺序控制流. 2.Java的线程是通过java.lang.Thread类来实现的. 3.VM启动时会有一个由主方法{public static void m ...
- [小北De编程手记] : Lesson 02 玩转 xUnit.Net 之 基本UnitTest & 数据驱动
关于<玩转 xUnit.Net>系列文章,我想跟大家分享的不是简单的运行一下测试用例或是介绍一下标签怎么使用(这样的文章网上很多).上一篇<Lesson 01 玩转 xUnit.Ne ...