【转】HttpModule和HttpHandler(续)
标题 | HttpModule和HttpHandler(续) 选择自 HowcanIdo 的 Blog |
关键字 | HttpModule和HttpHandler(续) |
出处 |
上篇讲到HttpModule,再接再厉,找到HttpHandler
作者:孙亚民 本文选自:赛迪网 2002年12月26日
HTTP 处理管道的基本模型
要对HttpModule和IHttpHandler进行研究,必须先对ASP.Net的处理管道有一个了解。
在ASP.Net应用程序中,系统使用一组相关的类,通过一定的顺序来处理客户端的请求(Request),ASP.NET应用程序的处理模式可称之为HTTP处理管道。HttpModule和IhttpHandler就是这个处理管道上的两个处理环节。
HTTP处理管道中的类在System.Web名称空间中定义,主要有以下类型:
· HttpWorkerRequest 抽象类定义了ASP.Net页面处理请求的基本方法;
· HttpRuntime 提供了处理应用的一组服务;
· HttpContext 保存了处理一次请求的所有相关上下文信息;
· HttpApplicationFactory 提供相关目录的应用程序;
· HttpApplication 定义了所有ASP.Net应用程序的通用的方法、属性和事件。这个类也是在用户在global.asax文件中定义的应用的基类;
· Modules 处理请求前和响应后的事件;
· HandlerFactories 提供应用程序中的Handlers;
· Handlers 处理请求和响应。
HTTP处理管道的模型如下:
图1:HTTP 处理管道
在Windows平台上,HTTP Pipline需要IIS的支持。为了运行ASP.NET应用,IIS需要以下两个文件:ASPNET_ISAPI.DLL和ASPNET_WP.EXE
· ASPNET_ISAPI.DLL是一个ISAPI Extention他将发向IIS的请转交ASPNET_WP.EXE处理
· ASPNET_WP.EXE使用HttpRuntime对请求进行具体处理
处理的过程可以用图表示如下:
图2:IIS上的HTTP处理管道
HttpHandler的实现
HttpHandler实现了类似于ISAPI Extention的功能,他处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的实现通过实现IHttpHandler接口来达到。实际上,我们在编写ASP.Net页面时,ASP.Net页面所继承的基类——System.Web.UI.Page——也实现了HttpHandler接口,也是一个HttpHandler,看一下它的定义就知道了(C#):
public class Page : TemplateControl, IhttpHandler |
接口IHttpHandler的定义如下:
interface IHttpHandler { void ProcessRequest(HttpContext ctx); bool IsReuseable { get; } } |
接口中ProcessRequest是添加自己的代码,进行相应处理的地方。IsReuseable属性指明该HttpHandler的实现类是否需要缓存。
下面的示例展示了HttpHandler的基本使用:
1、建立一个名为MyNameSpace的工程,添加一个类,名称为MyHandler,代码如下:
例1: namespace MyNameSpace { public class MyHandler : IHttpHandler { public void ProcessRequest(HttpContext ctx) { HttpResponse Response Response.Write("This is my handler");} public bool IsReusable { get { return true; } } } } |
2、将上面的代码编译,生成MyNameSpace.Dll文件;
3、建立一个新的WebApplication项目,或打开一个WebApplication项目,将文件MyNameSpace.Dll添加到项目的引用中,或复制到项目的bin目录下;
4、修改Web.Config,添加如下内容:
<configuration> <system.web><httpHndlers> <add verb="*" path="*.aspx" type=" MyNameSpace.MyHandr, MyNameSpace" /> </httpHndlers> </system.web> </configuration> |
配置文件中的选项说明:
· verb可以是"GET"或"POST",表示对GET或POST的请求进行处理。"*"表示对所有请求进行处理。
· Path指明对相应的文件进行处理,"*.aspx"表示对发给所有ASPX页面的请求进行处理。可以指明路径,如"/test/*.aspx",表明只对test目录下的ASPX文件进行处理。
· Type属性中,逗号前的字符串指明HttpHandler的实现类的类名,后面的字符串指明Dll文件的名称。
现在,请求项目中的任何ASPX页面,页面上显示的始终只有如下一行字:
This is my handler |
因为,我们自定义的Handler截获了所有发向ASPX页面的请求,并且用自己的的方法来处理这些请求了。
为了使我们的ASPX页面能够顺利运行,我们需要修改Web.Config文件:
<configuration> <system.web><httpHndlers> <add verb="*" path="*.foo" type=" MyNameSpace.MyHandr,hander" /> </httpHndlers> </system.web> </configuration> |
为了让对后缀名为.foo的文件的请求能够被我们的Handler截获运行,我们还需要一些额外的工作。打开IIS的管理控制台,又键单击站点,选择"属性",跳出站点的属性对话框。选择主目录选项。如图3:
图3:Web站点属性对话框
选择配置,弹出应用程序配置对话框,将".foo"添加到应用程序映射中,如图4:
图4:添加应用程序映射
好了,我们现在可以在项目中添加一个.foo文件,当向该文件发送请求时,浏览器显示:
This is my handler |
而对其他ASPX文件的访问不受影响。
实现Handler Factory
实现HttpHandler功能的另外一个选择是实现一个Handler Factory,这是通过实现IHttpHandlerFactory接口来实现的。
IHttpHandlerFactory接口的定义如下:
interface IHttpHandlerFactory { IHttpHandler GetHandler(HttpContext ctx, string requestType, string url, string pathTranslated); void ReleaseHandler(IHttpHandler handler); } |
GetHandler方法在请求开始的时候被调用,而ReleaseHandler在请求结束,所有的Handler都不再需要的时候被调用。
使用HttpHandlerFactory的过程一般如下:
首先定义实际处理HttpHandler的类,这个类会在HandlerFactory中被调用以进行实际的处理:
public class BasicHandler : IHttpHandler { ... } |
然后,定义自己的HandlerFactory:
public class BasicHandlerFactory : IHttpHandlerFactory { public IHttpHandler GetHandler(HttpContext ctx, string requestType, string url, string pathTranslated) { return new BasicHandler(); } public void ReleaseHandler(IHttpHandler handler) {} } |
最后,在Web.Config文件中注册这个Factory:
<configuration> <system.web> <httpHandlers> <add verb="POST" path="*.foo" type="MyNamespace.BasicHandlerFactory, MyAssembly" /> </httpHandlers> </system.web> </configuration> |
异步Handler
通过实现IHttpAsyncHandler可以实现对HTTP请求的异步处理。IHttpAsyncHandler接口继承IHttpHandler,也需要实现ProcessRequest 方法和 IsReusable 属性,同时,需要实现 BeginProcessRequest 和 EndProcessRequest 方法。BeginProcessRequest 启动异步调用以处理单个的 HTTP 请求,而 EndProcessRequest 则在该进程结束时执行清理代码。
IHttpAsyncHandler的实现和注册同IHttpHandler类似,读者可以参考MSDN的相关文档。
现在,大家是否对HTTP Handler的概念和应用有了一定的了解?在下一篇文章中,我们将主要介绍HTTP Module的的应用,并给出使用HttpModule实现权限系统的实例。
转载于:https://www.cnblogs.com/ringwang/archive/2009/09/21/1571440.html
【转】HttpModule和HttpHandler(续)相关推荐
- HttpModule与HttpHandler详解
ASP.NET对请求处理的过程: 当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll, ...
- HttpModule与HttpHandler详解(转)
一 asp.net请求的处理过程 ------------------- HttpModule必须要掌握的东西 HttpHandler 必须要掌握的东西,非常有用 以上两个的实例 ---------- ...
- ASP.NET-自定义HttpModule与HttpHandler
在之前的ASP.NET是如何在IIS下工作的这篇文章中介绍了ASP.NET与IIS配合工作的机制,在http请求经过一系列处理后,最后到达ASP.NET管道中,这时,就是Http Modules和Ht ...
- Asp.net中的HttpModule和HttpHandler的简单用法
在Asp.net中,HttpModule和HttpHandler均可以截取IIS消息进行处理,这使得我们制作人员能够非常方便的进行诸如图片水印添加,图片盗链检查等功能. 下面先就HttpModule的 ...
- DAN疼之后上些基础知识---自定义HttpModule和httpHandler
又是DAN疼的一天!! 木事做,怎么办,自定义点东西.那就拿HttpModule和httpHandler 开刀吧! 一:自定义HttpModule 自定义HttpModule需要实现IHttpModu ...
- C#强化系列:HttpModule,HttpHandler,HttpHandlerFactory简单使用
这三个对象我们在开发Asp.net程序时经常会用到,似乎很熟悉,但有时候又不太确定.本文通过一个简单的例子来直观的比较一下这三个对象的使用. HttpModule:Http模块,可以在页面处理前后.应 ...
- ASP.NET的(HttpModule,HttpHandler)
在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为inetinfo.exe进程所截获,这个进程实际上就是www服务.截获之后它会将这个请求转交给asp.dll进程 ...
- HttpHandler与HttpModule区别
ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pi ...
- ASP.NET内部原理(HttpHandler和HttpModule)
[IT168 技术文档]在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为 inetinfo.exe进程所截获,这个进程实际上就是www服务.截获之后它会将这个请 ...
最新文章
- Linux驱动:TI达芬奇系列kernel中cup类型的判断,以cpu_is_ti81xx()为例
- python之CSV文件格式
- 线性表的C/C++实现(数据结构 严蔚敏版)
- 敏捷软件开发 12 原则
- Unix——《Unix网络编程》配置unp.h头文件
- python实现TCP远程服务器文件上传,下载系统
- Ubuntu 16.04通过Snap安装应用程序
- C和C++中的计时器
- Linux内核DTB文件启动的几种方式
- YII2中behavior行为的理解与使用
- 如何安装Pycharm和汉化包(包括安装软件,无广告)
- 浏览器兼容性问题与解决方案
- Express框架的使用教程
- 【PBR理论】第2讲 BRDF理想漫反射(Diffuse)
- 【mpeg1】mpeg1相关资料
- 2022年建筑电工(建筑特殊工种)考试技巧及建筑电工(建筑特殊工种)复审模拟考试
- 树莓派3卡片电脑,指尖上的智慧
- 工信部通报下架60款APP:关联有赞、三六零、唯品会等上市公司
- python3 16进制字符串转ASCii码值
- 讲故事的技艺:《极乐迪斯科》中的叙事与机制
热门文章
- element js 包含字符_携程春招题目字符串截取和数组升维
- python中json模块_Python json模块与jsonpath模块区别详解
- python安装失败0x80070570_win7系统固态硬盘装系统出现错误代码0x80070570的解决方法...
- SAP License:赛锐信息访谈启示录(四)
- SAP License:SAP的国家会计科目表
- NET EF 连接Oracle 的配置方法记录
- 转: java服务器端成长指南
- PNP8550(3.3V DC蜂鸣器) - 原理图系列
- [恩分到动归分类好了]取石子游戏
- JZOJ 3426. 封印一击