1、处理程序
在ASP.NET中,所有的请求都要经过HttpApplication管道的处理,但是,请求的内容是多种多样的。因此,在HttpApplication的处理管道中,适合处理针对所有请求的内容并返回处理的结果。针对不同的请求的不同处理,在ASP.NET中通过各种处理程序来分别进行处理。通常情况下,根据请求的扩展名来确定处理程序,根据常见的请求类型,在ASP.NET中已经预定义了许多的处理程序
1.1、处理程序与Httpapplication的关系
HttpApplication作为请求到达处理程序和离开处理程序的一个管道,这个管道提供了统一处理所有请求的机制,使得我们可以在请求真正处理之前和处理之后进行预处理和处理后的工作,我们称之为过滤器(Filter)。ASP.NET通过大量的Httpapplication事件,这些事件按照固定的次序依次触发,使得我们可以方便地开发出针对请求不同处理环节的过滤器。在ASP.NET中处理Httpapplication事件的程序我们称为HttpHandler。
1.2、处理程序接口IHttpHandler和IHttpAsyncHandler
在ASP.NET中所有的处理程序类必须实现IHttpHandler接口(同步接口)或者实现IHttpAsyncHandler接口(异步接口),两个接口的定义如下:
public interface IHttpHandler { // Methods void ProcessRequest(HttpContext context);
// Properties bool IsReusable { get; } }
|
|
public interface IHttpAsyncHandler : IHttpHandler
{
// Methods
IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData);
void EndProcessRequest(IAsyncResult result);
}
ProcessRequest(HttpContext context)这个方法可以通过context得到处理请求所需的信息,在通过Response属性向客户端返回服务器处理的结果
IsReusable这个属性表示当这个处理程序对象在使用之后,是否还可以被缓存起来,在以后的请求处理中再次使用,这个属性主要用来配合处理程序工厂的使用。
异步处理程序主要是将当前请求过程转移当线程池中来处理。
1.3、处理程序中使用的会话
在默认情况下,在处理程序中,不能使用会话状态。要用的话必须实现IRequiresSessionState标记接口
1.4、处理程序工厂
实现处理程序接口的类就可以被用来创建处理程序对象直接使用,如果再配合一个处理程序工厂,那么就可以实现处理程序对象的管理。
在ASP.NET中,作为处理程序工厂的类必须实现接口IHttpHandlerFactory,这个接口定义如下:
public interface IHttpHandlerFactory { // Methods IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated); void ReleaseHandler(IHttpHandler handler); }
|
其中GetHandler方法用来通过这个处理程序工厂获取一个处理程序对象,ReleaseHandler方法用来释放一个处理程序对象
1.5、注册处理程序
每一种处理程序用来处理一类的请求,不同的请求类别通过请求的扩展名来进行区分,处理程序与请求之间的匹配关系在网站的配置文件web.config中通过配置参数进行设置。System.web配置元素的子元素httphandlers用来配置网站所使用的处理程序,
<httpHandlers>
<add verb="请求类型(get,post)" path="请求让处理程序处理的文件类型,一般以后缀结尾" type="处理程序的命名空间,处理程序的dll文件"/>
</httpHandlers>
在网站应用程序运行的时候,实际得到的配置文件来自系统的machine.config,系统的web.config和网站自身的web.config的合并
1.6、使用处理程序生成验证码
必须实现IHttpHandler接口和IRequiresSessionState接口
设置context.Resonse.ContentType=”image/jpeg”;
2、一般处理程序
一般处理程序是ASP.NET提供的对处理程序的简化和封装,是一个以.ashx结尾的文件,这个处理程序ASP.NET直接在系统的配置文件中映射到ashx扩展名的请求上。因此,我们不需要在配置文件配置了。
使用场合:一般在处理对于处理结果不是html的请求都可以用一般处理程序来完成。比如:xml,图片,RSS等。
3、页面处理程序
ASP.NET使用模板的方法来生成一个处理程序。模板扩展名为aspx,通过一个内置的处理程序工厂PageHandlerFactory将aspx形式的模板编译生成处理程序的代码,然后将这个处理程序返回给Httpapplication完成请求的处理。
3.1、页面处理程序工厂
在ASP.NET的系统配置文件中,已经进行了如下配置:
<add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" />
表示将所有后缀名为.aspx的文件都交给System.Web.UI.PageHandlerFactory来处理
一下是PageHandlerFactory的定义
public class PageHandlerFactory : IHttpHandlerFactory2, IHttpHandlerFactory
用来返回一个实现IHttpHandler接口的处理程序对象实例
PageHandlerFactory将寻找匹配请求名称的aspx文件,然后将这个模板文件进行解析。通过代码生成机制生成相应的页面类,这个页面类派生自Page类
public class Page : TemplateControl, IHttpHandler
3.2、创建页面处理程序
在PageHandlerFactory的内部,通过PageParser这个类解析指定的aspx文件生成Page类的派生类。这个派生类用来创建页面处理程序的对象实例。
3.3、生成的代码
对于每一个前台Index.aspx页面,通过PageHandlerFactory,将该aspx页面生成两个类,一个是部分类,最终与后台类合并成一个完整的类Index,一个是前台类Index_aspx,该类继承自后台类,用来创建实际的页面对象实例。
3.4、使用页面处理程序
由于页面处理程序是通过模板生成的,所以,大多数情况下,我们只要创建好这个aspx的模板就可以了,HttpApplication会通过PageHandlerFactory创建这个生成处理程序,然后使用这个处理程序完成服务器的处理任务。如果我们要自己创建aspx模板,可以通过PageParse或者BuildManager通过aspx格式的模板来创建一个自定义的处理程序来处理任务。
4、MVC处理程序
在ASP.NET MVC2下,引入了Controller的概念,请求将被首先路由到Controller进行处理,然后由Controller分配到相应的Action完成实际的处理操作。然后将处理结果返回给view转换成显示的界面元素,最终发送到客户端完成处理任务。
在ASP.NET MVC2下,整个MVC的路由中心也是一个处理程序,由这个处理程序再通过一个控制器工厂来取得实际的Controller,开始处理工作。默认情况下,这个处理程序的类型是MvcRouteHandler,这个处理程序可以在route.MapRoute方法中进行指定。
未完,待续...
以上资料参考自:asp.net本质论(郝冠军 著)