HttpModuler与HttpHandler介绍和简单使用

1 Asp.Net中的处理流程
当客户端请求一个*文件的时候,这个请求会被inetinfo.exe(IIS相关的系统组件)进程截获,它判断文件类型后,将这个请求转交给ASPNET_ISAPI.dllASPNET_ISAPI.dll会通过http管道(Http PipeLine)将请求发送给ASPNET_WP.exe进程,在ASPNET_WP.exe进程中通过HttpRuntime来处理这个请求,处理完毕将结果返回客户端。
inetinfo.exe进程:是www服务的进程,IIS服务和ASPNET_ISAPI.DLL都寄存在此进程中。
ASPNET_ISAPI.DLL:是处理.aspx文件的win32组件。其实IIS服务器是只能识别静态文件的,当IIS服务器发现被请求的文件是.aspx文件时,IIS服务器将其交给aspnet_isapi.dll来处理。
aspnet_wp.exe进程:ASP.NET框架进程,提运行的托管环境的CLR(公共语言运行时)就是寄存在此进程中。
ASP.NET Framework处理一个Http Request的流程:
HttpRequest-->inetinfo.exe-->ASPNET_ISAPI.dll-->ASPNET_WP.exe-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()
ASP.NET请求处理过程基于管道模型,管道模型由多个HttpModule和HttpHandler组成(默认19个管道事件),ASP.NET把http请求依次传递给管道中各个HttpModule,最终被HttpHandler处理,处理完成后,再次经过管道中的HTTP模块,把结果返回给客户端,可以在每个HttpModule中都可以干预请求的处理过程。
2 HttpModule
2.1 自定义,实现System.Web.IHttpModule接口的类。 这里以简单在处理完请求后,输出一些公司的版权信息为例,关于context 可以注册的事件为19个,详细介绍参照图1.ASP.NET管道事件和页面生命周期示意图

public class WriteCompanyInfoModuler : System.Web.IHttpModule{public void Init(HttpApplication context){context.EndRequest += new EventHandler((s, e) =>{HttpApplication httpAplication = (HttpApplication)s; httpAplication.Response.Write(""); }); }public void Dispose(){}}

然后在Web.config 中配置如下节点System.web节点下:

name 为Moduler的名字,type:有两部分组成,前半部分是命名空间和类名组成的全名,后半部分是程序集名称。
可以在网站的任何一个网页下看到,如下信息:
HttpModuler与HttpHandler介绍和简单使用
文章图片
clipboard.png 图一---ASP.NET管道事件和页面生命周期示意图(图片来源于黑马学生)

HttpModuler与HttpHandler介绍和简单使用
文章图片
clipboard.png 在httpModule中自定义自己的HttpModule 可以实现登录,权限控制等操作。
3 HttpHandler
HttpHandler是处理客户端的请求上下文的最后步骤,对服务器页面进行编译实例化执行,将处理后的信息返回给客户端,一旦自定义HttpHandler 将覆盖系统的默认HttpHander.
3.1 示例:自定义文件类型,可以做验证码路径,UrlReWrite等。
public class MyHttpHandler : IHttpHandler{public MyHttpHandler(bool isReusable){IsReusable = isReusable; }public void ProcessRequest(HttpContext context){//处理请求,返回请求context.Response.Write("这个自定义的shtml文件"); }public bool IsReusable { get; private set; }}

web.config配置:

3.2 注意
ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pipeline中各个HttpModule的处理,最后将HTML发送到客户端浏览 器中。
4 IHttpModule与IHttpHandler的区别整理
1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的
2.对请求的处理上:
IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它; 例如aspx,rar,html的请求.
IHttpHandler则属于挑食类型,只有注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.
3.IHttpHandler按照你的请求 生成响应的内容,IHttpModule对请求进行预处理,如验证、修改、过滤等等,同时也可以对响应进行处理
【HttpModuler与HttpHandler介绍和简单使用】ASP.Net系统本身配置有很多HttpHandler和HttpModule,以处理aspx等.Net标准的页面文件,以及这些页面文件中标 准的事件处理等。查看%System%/Microsoft.NET\Framework\v2.0.50727\CONFIG目录下的 nfig文件中的httpHandlers和httpModules节点,可以看到这些配置。如果有兴趣,可以使用Reflector查 看.Net系统中相关的类和方法,了解.Net如何处理以及做了什么处理。
.Net也提供了一套机制来开发自定义的HttpHandler和 HttpModule,均可以用于对HttpRequest的截取,完成自定义的处理。 HttpModule 继承System.Web.IHttpModule接口,实现自己的HttpModule类。必须要实现接口的两个方法:Init和Dispose。在 Init中,可以添加需要截取的事件;Dispose用于资源的释放,如果在Init中创建了自己的资源对象,请在Dispose中进行释放。
以上参考:http://www.educity.cn/develop/474379.html

    推荐阅读