zoukankan      html  css  js  c++  java
  • 002. Asp.Net Routing与MVC 之(基础知识):HttpModule 与 HttpHandler

    本文By 杨工.

    一、 Http.sys

    http.sys 从Win2003和WinXP SP2开始,就成为windows操作系统内核驱动程序,能够让任何应用程序通过它提供的接口,以http协议进行信息通讯。

    如果用户不慎删除了该驱动文件,该驱动会在下次系统启动时重建。是一个删除不掉的系统核心组件,手动结束该驱动,该驱动也会马上重新创建(只有粉碎文件才不能马上重建,但粉碎后,下次启动会重建)。

    新的Http.sys带来的好处大致有如下一些:

    1. 缓存 - 静态的内容现在被缓存于内核模式下,这使服务响应速度更快

    2. 记录 (Log)-IIS的log功能更快且标准化了

    3. 带宽控制 -更大的可伸缩性的控制和调节

    4. 可靠性 - 所有的服务请求会在Http.sys里暂存入队列,而不是由服务程序本身来处理,这样,即使WEB服务程序重启,尚未被处理的请求也不会丢失了

    5. IP端口重用 -只要是通过Http.sys管理的端口(基本包括了那些著名的端口,比如80),都可以同时允许多个程序同时监听了。

    Http.sys 是IIS 6.0使用的新型侦听器。在IIS 6.0出现之前,inetinfo.exe完成侦听HTTP请求的功能,同时还要将请求转发给对应的处理程序。从IIS 6.0开始,侦听器与inetinfo.exe分离开来,inetinfo.exe在用户模式下运行,Http.sys则完成侦听HTTP请求的功能,在 内核模式下运行。

     

    二、 IIS的生命周期

    1、HttpApplication 对象分配给请求

    clip_image001

    2、集成处理管道

    clip_image003

     

    三、HttpModule

    1、HttpModule是实现了System.Web.IhttpModule接口的类。

    IHttpModule接口的声明:

    public interface IHttpModule

    {

    void Init (HttpApplication context);

    void Dispose ();

    }

    Init 方法:系统初始化的时候自动调用,这个方法允许HTTP模块向HttpApplication 对象中的事件注册自己的事件处理程序。

    Dispose方法: 这个方法给予HTTP模块在对象被垃圾收集之前执行清理的机会。此方法一般无需编写代码。

    2、事件

    HTTP模块可以向System.Web.HttpApplication对象注册下面一系列事件:

    AcquireRequestState 当ASP.NET运行时准备好接收当前HTTP请求的对话状态的时候引发这个事件。

    AuthenticateRequest 当ASP.NET 运行时准备验证用户身份的时候引发这个事件。

    AuthorizeRequest 当ASP.NET运行时准备授权用户访问资源的时候引发这个事件。

    BeginRequest 当ASP.NET运行时接收到新的HTTP请求的时候引发这个事件。

    Disposed 当ASP.NET完成HTTP请求的处理过程时引发这个事件。

    EndRequest 把响应内容发送到客户端之前引发这个事件。

    Error 在处理HTTP请求的过程中出现未处理异常的时候引发这个事件。

    PostRequestHandlerExecute 在HTTP处理程序结束执行的时候引发这个事件。

    PreRequestHandlerExecute 在ASP.NET开始执行HTTP请求的处理程序之前引发这个事件。在这个事件之后,ASP.NET 把该请求转发给适当的HTTP处理程序。

    PreSendRequestContent 在ASP.NET把响应内容发送到客户端之前引发这个事件。这个事件允许我们在内容到达客户端之前改变响应内容。我们可以使用这个事件给页面输出添加用于所有页面的内容。例如通用菜单、头信息或脚信息。

    PreSendRequestHeaders 在ASP.NET把HTTP响应头信息发送给客户端之前引发这个事件。在头信息到达客户端之前,这个事件允许我们改变它的内容。我们可以使用这个事件在头信息中添加cookie和自定义数据。

    ReleaseRequestState 当ASP.NET结束所搜有的请求处理程序执行的时候引发这个事件。

    ResolveRequestCache 我们引发这个事

    件来决定是否可以使用从输出缓冲返回的内容来结束请求。这依赖于Web应用程序的输出缓冲时怎样设置的。

    UpdateRequestCache 当ASP.NET完成了当前的HTTP请求的处理,并且输出内容已经准备好添加给输出缓冲的时候,引发这个事件。这依赖于Web应用程序的输出缓冲是如何设置的。

     

    四、 HttpHandler

    HttpHandler是HTTP请求的处理中心,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。

    HttpHandler与HttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系。

    在http请求的处理过程中,只能调用一个HttpHandler,但可以调用多个HttpModule。

    参见:

    http://msdn.microsoft.com/zh-cn/library/ms178472%28v=vs.100%29.aspx

    另外,网上还有很多写的好的文章,两个传送门:

    《HttpModule与HttpHandler详解》
    http://www.cnblogs.com/yuanyuan/archive/2010/11/15/1877709.html

    《HttpHandler HttpModule入门篇》 (针对ASP.NET 2.0 内容依然适用)
    http://www.cnblogs.com/cyan/archive/2009/02/04/1383580.html

  • 相关阅读:
    php 安装 Redis 扩展
    远程连接mysql出现"Can't connect to MySQL server 'Ip' ()"的解决办法
    MySQL 连接超时:报错SQLSTATE[HY000] [2002] Connection timed out解决
    linux命令解压压缩rar文件
    Xshell、Xftp评估过期的解决办法
    远程连接mysql出现1045错误的解决办法
    PHP 判断当前日期是否是法定节假日或者休息日
    PHP解压压缩包文件到指定目录的实现
    PHP逐行解析文件,并写入数据库
    PHP编程实现多维数组按照某个键值排序的方法
  • 原文地址:https://www.cnblogs.com/acejason/p/3878219.html
Copyright © 2011-2022 走看看