前言                                   

  之前从网上找了几篇讲解如何自定义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 IsReusable14     {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     #endregion20 }

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. 7.STM32中对DMA_Config()函数的理解(自定义)测试DMA传输数据时CPU还可继续工作其他的事

    STM32中对DMA_Config()函数的理解(自定义):

  2. 3.STM32中对EXTI_PE5_Config()函数的理解(自定义)之中断控制按键LED

    STM32中对EXTI_PE5_Config()函数的理解(自定义)

  3. 2.STM32中对Key_GPIO_Config()函数的理解(自定义)之轮询控制按键LED

    STM32中对Key_GPIO_Config()函数的理解(自定义)

  4. 1.STM32中对LED_GPIO_Config()函数的理解(自定义)之流水灯

    STM32中对LED_GPIO_Config()函数的理解(自定义)

  5. 在自定义HttpHandler中如何使用Session

    今天我写了一段程序在HttpHandler中使用Session.结果Session对象报错,"未将对象引用设置到对象的实例",我郁闷半天,不知道怎么回事. 结果我google了一下 ...

  6. 在自定义HttpHandler中使用Session

    最近需要做一个对特定请求进行响应的接口,只是在内部处理,不存在UI,机于这种情况,当然是使用实现IHttpHandler来进行处理,可以减掉加载HTML 控件的时间.本来都是这样想的,对于IHttpH ...

  7. C#.Net工作笔记017---C#事件的理解以及自定义事件的方法

    技术交流QQ群[JAVA,C,.NET,BigData,AI]:170933152 哈哈,拿来主义,根据下面的这篇博文,我给葡萄城flexgrid控件,自己做了个自定义的单元格,然后利用flexgri ...

  8. 【Tensorflow】op的理解和自定义损失函数

    tensorflow中的基本概念 本文是在阅读官方文档后的一些个人理解. 官方文档地址:https://www.tensorflow.org/versions/r0.12/get_started/ba ...

  9. 理解Java自定义类作为数据类型——引用数据类型

    目录 说在前面的话 复现问题 引用数据类型的理解 总结 说在前面的话 前言:Java的数据类型按照类型可分为基本数据类型(byte.short.int.long.double.float.char.b ...

最新文章

  1. 文件服务器文件多备份方案,windows文件服务器冗余备份方案.doc
  2. pendingIntent
  3. HDU 4619 Warm up 2 (多校)
  4. etl报表开发是什么意思_中间表是什么?和报表有什么关系?会带来怎样的问题?又如何解决?...
  5. 通过例子理解事务的4种隔离级别
  6. Java学习个人备忘录之构造函数this
  7. Google 员工公开 Windows 10 零日漏洞隐藏 Bug!
  8. 解决:configure: error: Missing Xext.h, maybe to install libxext-dev packages?
  9. matlab打包多个m文件,MATLAB GUI多个m文件和fig如何生成exe文件
  10. 【点云预处理】10种点云数据数据预处理增强方法 — 持续总结和更新(一)
  11. 那些被一行代码蒸发1个亿的智能合约,形式化验证了解一下? | 人物志
  12. signature=caf1e99ac9ac407b9c928d57b6757f28,恶意软件分析 URL链接扫描 免费在线病毒分析平台 | 魔盾安全分析...
  13. 基于IIS Live Smooth Streaming技术流媒体直播系统
  14. 整理了18个可以免费学习编程的网站
  15. 操作系统为什么需要驱动? 驱动程序是什么?为什么有的硬件“免驱”?
  16. 无处不在_您的图片是病毒。 他们在互联网上无处不在
  17. 线下沙龙:靠谱的区块链应用到底是啥样?
  18. Python 之父出生 | 历史上的今天
  19. ps滤镜之旋转扭曲算法实现
  20. 超全面!Verilog入门到实战系列(1)

热门文章

  1. fpga驱动步进电机转动指定角度_【硬见小百科】步进电机工作原理及实现方法...
  2. python技术点总结_Python技术点总结,碰到问题再也不用慌了!
  3. 使用recon/domains-hosts/baidu_site模块,枚举baidu网站的子域
  4. 计算机电缆怎么做耐压试验,ZGF直流高压发生器进行电缆耐压试验的6个步骤
  5. class不生效 weblogic_weblogic配置Log4j不生效的问题
  6. 6 js 比较两个数组的差异_每天一道算法题(js)(3)——寻找两个有序数组的中位数...
  7. 如何保留5个有效数字输出c不4舍5入_10 个C语言课设小项目拿走不谢~
  8. Xcode 报错Could not find developer disk image,iOS10
  9. 健康大脑结构的变化如何影响认知的?
  10. DokiCam 360°4K相机:为极致运动爱好者而生