上篇文章我们主要讲了HttpApplicatiion管道事件,那么我么如何处理这些管道事件呢,以及请求在ASP.NET是如何执行的呢,我们来了解一下IHttpHandler和IHttpModule
引言:
处理HttpApplicatiion事件
HttpApplication提供了基于事件的扩展机制,允许程序员借助于处理管道中的事件进行处理过程扩展。由于HttpApplication对象是ASP.NET基础架构来创建和维护,那么如何才能获得这个对象引用,以便于注册HttpApplication对象的事件处理,在ASP.NET中提供了两种方式来 解决这个问题:IHttpModule和global.aspx,这两种方式的核心都是IHttpModule几口,下面我们就主要讲IHttpModule。
正文:
IHttpModule的用途以及用法
在ASP.NET中,定义在System.Web命名空间下的IHttpModule接口专门用了定义HttpApplication对象的事件处理。
实现IHttpModule接口的类成为HttpModule。IHttpModule接口的定义如下,仅仅包含两个成员:
public interface IHttpModule { void Dispose() void Init(HttpApplication context) }
其中,Dispose方法用于回收Module所使用的非托管资源,如果没有的话,直接返回即可。
最重要的是第二个方法Init,可以看到这个方法接受一个HttpApplication类型的参数,在ASP.NET中,每当创建一个HttpApplication对象实例,将遍历注册的HttpModule类型,通过反射依次创建 么个注册HttpModule类型的一个实例对象,并将这个HttpApplication实例通过Init方法传递给各个HttpModule,这样HttpModule对象就可以在第一时间完成针对HttpApplication对象的事件注册了。
例如,希望写一个PostAuthenticateRequest事件的HttpModule,那么就可以完成以下注册
pulic class xxx:IHttpModule { void Dispose() void Init(HttpApplication app) { app.PostAuthencateRequest+=new EventHandler(app_PostAuthencateRequest) } }
当然,实现IHttpModule接口只是实现HttpModule的一部分,在ASP.NET中所使用的HttpModule还要在网站配置文件中进行注册才能真正生效,并在ASP.NET中使用,这一点我们就不在讲解了,下面看一下IHttpHandler。
IHttpHandler
在ASP.NET中,请求的真正处理就是在处理程序这个环节,也就是在HttpApplication19个标准事件的PreRequestHandlerExcute和PostRequestHandlerExcute之间,PreRequestHandlerExcute负责同志程序员,处理程序就要开始工作了,PostRequestHandlerExcute事件同志程序员ASP.NET服务器的处理程序已经完成。那么HttpApplication的作用是什么呢?我们可以把它看做请求到达处理程序和离开处理程序的一个管道,这个管道提供了统一处理所有请求的机制,使得我们可以在请求被真正处理之前和处理之后进行预处理和处理后的工作。
处理程序负责完成实际的请求处理工作,对于网站开发人员来说,大多数的开发工作是围绕着处理程序展开的。(其实我们可以看到,我们的页面类也就是Page实现了IHttphandler接口)实际上,接触到HttpApplication事件处理的时候并不多,处理程序在不同的网站开发技术中有不同的名字,在ASP.NET中,为HttpHandler。
在ASP.NET中,所有的处理程序类必须实现IHttpHandler接口或者实现IHttpAsyncHandler接口,我们可以很明显看出区别来,一个是同步接口,一个是异步处理模式的接口。那么我们通常使用的是同步模式的接口。下面我们简单介绍一下
这两个接口都定义在System.Web下,IHttphandler接口的定义如下
public interface IHttpHandler { void ProcessRequest(HttpContext context) bool IsRequest{get;} }
ProcessRequest是这个接口的主要方法,接收一个HttpContext类型的请求上下文对象,通过这个对象,处理程序可以得到关于处理请求所需的信息,通过这个参数的Response属性可以得到管理回应的对象,可以向客户端返回服务器的处理结果。
IsRequest属性表示当这个处理程序对象在使用之后,是否还可以被缓存起来,在以后的请求处理中用。
当然,同样的是我们也要注册处理程序,每一种处理处理程序用来处理一类的请求,处理程序与请求之间的匹配关系可以在网站的配置文件中通过配置参数来进行设置。