前言                                   

  之前从网上找了几篇讲解如何自定义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:\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的更多相关文章

  1. web form中自定义HttpHandler仿mvc

    web form中自定义HttpHandler仿mvc 前言 在mvc大行其道的今天,仍然有不少公司的项目还是使用web form来实现的(其实mvc也是基于web form的),如果要在项目中引入m ...

  2. 深入理解Android 自定义attr Style styleable以及其应用

    相信每一位从事Android开发的猿都遇到过需要自己去自定义View的需求,如果想通过xml指定一些我们自己需要的参数,就需要自己声明一个styleable,并在里面自己定义一些attr属性,这个过程 ...

  3. 自定义HttpHandler

    1.创建自定义类型 2.继承IHttpHandler接口,并实现 3.配置Web.Config文件,注册类型 4.访问 public class QuickMsgSatisticsHandler : ...

  4. Java Serializable接口(序列化)理解及自定义序列化

      1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反 ...

  5. 自定义HttpHandler配置iis8.0

    配置环境,window8 ,iis8.0,.net Framework4.0,托管管道模式“经典” 步骤 (1)进入iis管理器,选中要设置的网站-->功能视图-->MIME类型--> ...

  6. 自定义 httpHandler 配置

    开发 环境 vs2010.asp.net 4.0 时 写在<system.web>  ,<httpHandlers>节点下 部署 环境Windows server 2007 , ...

  7. Asp.net管道模型(管线模型)

    Asp.net管道模型(管线模型)   前言 为什么我会起这样的一个标题,其实我原本只想了解asp.net的管道模型而已,但在查看资料的时候遇到不明白的地方又横向地查阅了其他相关的资料,而收获比当初预 ...

  8. Asp.net管道模型(管线模型)之一发不可收拾

    前言 为什么我会起这样的一个标题,其实我原本只想了解asp.net的管道模型而已,但在查看资料的时候遇到不明白的地方又横向地查阅了其他相关的资料,而收获比当初预想的大了很多. 有本篇作基础,下面两篇就 ...

  9. 理解AngularJS生命周期:利用ng-repeat动态解析自定义directive

    ng-repeat是AngularJS中一个非常重要和有意思的directive,常见的用法之一是将某种自定义directive和ng-repeat一起使用,循环地来渲染开发者所需要的组件.比如现在有 ...

随机推荐

  1. Winform开发框架中实现多种数据库类型切换以及分拆数据库的支持

    在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适 ...

  2. ASP.NET MVC 学习之路由(URL Routing)

    在ASP.NET MVC中,一个URL请求是由对应的一个Controller中的Action来处理的,由URL Routing来告诉MVC如何定位到正确的Controller和Action. 默认路由 ...

  3. android The connection to adb is down 错误信息

    之前运行eclipse执行android应用都没问题,今天突然出问题了,控制台报错: The connection to adb is down, and a severe error has occ ...

  4. C/C++程序员必须熟练应用的开源项目

    作为一个经验丰富的C/C++程序员, 肯定亲手写过各种功能的代码, 比如封装过数据库访问的类, 封装过网络通信的类,封装过日志操作的类, 封装过文件访问的类, 封装过UI界面库等, 也在实际的项目中应 ...

  5. 聊一下C#开发者如何过渡到JAVA 开发者

    由于工作需要,最近也开始倒腾Java了.NET的话,从2012年测试版开始玩的,那个时候VB6比较熟悉,还天真的以为VB.NET以后会很火, 事实证明,也只是一厢情愿,有C#了,要VB.NET干什么? ...

  6. iTextSharp快速使用指南

    前言 最近公司一直使用iText开发PDF报表,使用一段时间之后发现iText这个类库虽然是庞大无比,但作为程序猿我们不需要知道所有的类和方法,我们只需要知道如何使用即可. 所以这篇文章就是告诉大家如 ...

  7. Java Collection或Map的同步

    新集合也提供了能防止多个进程同时修改一个容器内容的机制.若在一个容器里反复,同时另一些进程介入,并在那个容器中插入.删除或修改一个对象,便会面临发生冲突的危险.我们可能已传递了那个对象,可能它位于我们 ...

  8. [转]浅谈php web安全

    原文地址:http://blogread.cn/it/article/6086?f=wb 前言: 首先,笔记不是web安全的专家,所以这不是web安全方面专家级文章,而是学习笔记.细心总结文章,里面有 ...

  9. js 小数[非]四舍五入

    1.四舍五入 (2.678).toFixed(2) // 2.68 2.不需要四舍五入 (parseInt(2.678*100)/100.0).toFixed(2) // 2.67 3.字节单位转换 ...

  10. 简洁的jQuery cxMenu 手风琴导航

    版本: jQuery v1.7+ jQuery cxMenu v1.2 注意事项: 自动判断是否有子导航,有则显示并不触发链接,无则触发链接. 实例预览 使用方法 载入 JavaScript 文件 & ...