HTTP请求处理程序

1、处理程序

ASP.NET中,所有的请求都要经过HttpApplication管道的处理,但是,请求的内容是多种多样的。因此,在HttpApplication的处理管道中,适合处理针对所有请求的内容并返回处理的结果。针对不同的请求的不同处理,在ASP.NET中通过各种处理程序来分别进行处理。通常情况下,根据请求的扩展名来确定处理程序,根据常见的请求类型,在ASP.NET中已经预定义了许多的处理程序

1.1、处理程序与Httpapplication的关系

HttpApplication作为请求到达处理程序和离开处理程序的一个管道,这个管道提供了统一处理所有请求的机制,使得我们可以在请求真正处理之前和处理之后进行预处理和处理后的工作,我们称之为过滤器(Filter)。ASP.NET通过大量的Httpapplication事件,这些事件按照固定的次序依次触发,使得我们可以方便地开发出针对请求不同处理环节的过滤器。在ASP.NET中处理Httpapplication事件的程序我们称为HttpHandler

1.2、处理程序接口IHttpHandlerIHttpAsyncHandler

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,通过一个内置的处理程序工厂PageHandlerFactoryaspx形式的模板编译生成处理程序的代码,然后将这个处理程序返回给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 : IHttpHandlerFactory2IHttpHandlerFactory

 

用来返回一个实现IHttpHandler接口的处理程序对象实例

PageHandlerFactory将寻找匹配请求名称的aspx文件,然后将这个模板文件进行解析。通过代码生成机制生成相应的页面类,这个页面类派生自Page

public class Page : TemplateControlIHttpHandler

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本质论(郝冠军 著)

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯的世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值