理解并自定义HttpHandler-阿里云开发者社区

开发者社区> 吞吞吐吐的> 正文

理解并自定义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:\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防止图片盗链的实例,很实用哦!

如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!


本文转自^_^肥仔John博客园博客,原文链接:http://www.cnblogs.com/fsjohnhuang/archive/2012/02/04/2338003.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SAP CRM服务请求subject value determination
SAP CRM服务请求subject value determination
15 0
SAP Server Side JavaScript解决方案
SAP Server Side JavaScript解决方案
12 0
SAP Spartacus 里的 cxOutletRef 指令执行过程分析
SAP Spartacus 里的 cxOutletRef 指令执行过程分析
3 0
mysql数据库的常用方法,增删改查
RDBMS DQL:数据查询语言,用于对数据进行查询,如select DML:数据操作语言,对数据进行增加、修改、删除,如insert、udpate、delete TPL:事务处理语言,对事务进行处理,包括begin transaction、commit、rollback DCL:数据控制语言,进行授权与权限回收,如grant、revoke DDL:数据定义语言,进行数据库、表的管理等,如create、drop CCL:指针控制语言,通过控制指针完成表的操作,如declare cursor
9 0
将您的基于 Accelerator 的 SAP Commerce Cloud Storefront 迁移到 Spartacus Storefront
将您的基于 Accelerator 的 SAP Commerce Cloud Storefront 迁移到 Spartacus Storefront
7 0
ng-template 和 TemplateRef.createEmbeddedView
ng-template 和 TemplateRef.createEmbeddedView
4 0
SAP Cloud for Customer CLR(Code List Restriction)的一种高级用法
SAP Cloud for Customer CLR(Code List Restriction)的一种高级用法
16 0
2021召回技术在内容推荐的实践总结
本文从跨域联合召会、语义&图谱&多模态、用户多兴趣表征和未来工作四个模块展开。
3 0
第四范式首席研究科学家陈雨强:机器学习模型,宽与深的大战
5 月 27 日,机器之心主办的为期两天的全球机器智能峰会(GMIS 2017)在北京 898 创新空间顺利开幕。
10 0
分页准备工作 | 学习笔记
快速学习分页准备工作
4 0
4533
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载