创建自定义 HTTP 模块类

 * HTTP 模块和 HTTP 处理程序是 ASP.NET 体系结构的组成部分。在对一个请求进行处理时,由多个 HTTP 模块
    (例如,身份验证模块和会话模块)处理每个请求,然后再由单个 HTTP 处理程序来处理。处理程序处理请求之后,
    该请求再通过 HTTP 模块流转回来。

 * HTTP 模块:
    HTTP 模块是一个在每次针对应用程序发出请求时调用的程序集。HTTP 模块作为 ASP.NET 请求管线的一部分调用,
    能够在整个请求过程中访问生命周期事件。因此,HTTP 模块使您有机会检查传入和传出的请求,并根据该请求采
    取操作。本节中的主题提供有关 HTTP 模块的工作原理以及如何创建 HTTP 模块的信息。

    HTTP 模块在执行处理程序前后调用。模块使开发人员可以截获、参与或修改各个请求。模块实现 IHttpModule
    接口,该接口位于 System.Web 名称空间中。

 * HttpModule实现了ISAPI Filter的功能,是通过对IhttpModule接口的继承来处理。
 *
 * IHttpModule:向实现类提供模块初始化和处置事件。
 * IHttpModule公共方法
       Dispose:处置由实现 IHttpModule 的模块使用的资源(内存除外)。
       Init:初始化模块,并使其为处理请求做好准备。
 *
 * 创建 HTTP 模块:
    要创建 HTTP 模块,必须实现 IHttpModule 接口。IHttpModule 接口具有两种方法,并带有下列签名:
    void Init(HttpApplication);
    void Dispose();

 *
 * 配置 HTTP 模块:
    Web.config配置:(此例子用命名空间+类名和模块名注册该模块)
    通用配置:
    <httpModules>
        <add name="HttpModule的名称" type="命名空间 + 类名,程序集名称"/>
        ...
    </httpModules>
//

先了解一下IIS系统。它是一个程序,负责对网站的内容进行管理并且处理对客户的请求做出反应。当用户对一个页面
提出请求时,IIS做如下反应(不考虑权限问题):
1.把对方请求的虚拟路径转换成物理路径
2.根据物理路径搜索请求的文件
3.找到文件后,获取文件的内容
4.生成Http头信息。
5.向客户端发送所有的文件内容:首先是头信息,然后是Html内容,最后是其它文件的内容(如图片、JS等)。
6.客户端IE浏览器获得信息后,解析文件内容,找出其中的引用文件,如.js .css .gif等,向IIS请求这些文件。
7.IIS获取请求后,发送文件内容。
8.当浏览器获取所有内容后,生成内容界面,客户就看到图像/文本/其它内容了。

 *HttpApplication:
    HttpApplication:定义 ASP.NET 应用程序中的所有应用程序对象通用的方法、属性和事件。
    此类是用户在 global.asax 文件中所定义的应用程序的基类。
 
HttpApplication 类提供有大量事件,模块可以与这些事件同步。对于每个请求,模块都可以与下列事件同步。这些
事件是按先后顺序列出的:
 * • BeginRequest:请求已开始。如果您需要在请求刚开始时执行某些操作(例如在每页的顶部显示广告横幅),请同步
 *      此事件。
 * • AuthenticateRequest:如果您要插入自己自定义的身份验证方案(例如,在数据库中查找用户以验证密码),请构
 *      建一个模块以同步此事件并按您需要的方式验证用户身份。
 * • AuthorizeRequest:此事件用于内部实现授权机制(例如,将您的访问控制列表 (ACL) 存储在数据库中而不是文件
 *      系统中)。虽然您可以覆盖此事件,但是最好不要这样做。
 * • ResolveRequestCache:此事件确定是否可以从输出缓存中调用某个页面。如果您要编写自己的缓存模块(例如,
 *      构建基于文件的缓存,而不是内存缓存),请同步此事件以确定是否从缓存中调用页面。
 * • AcquireRequestState:从状态存储中检索会话状态。如果您要构建自己的状态管理模块,请同步此事件以从您的
 *      状态存储中抓取会话状态。
 * • PreRequestHandlerExecute:此事件在执行 HTTP 处理程序之前发生。
 * • PostRequestHandlerExecute:此事件在执行 HTTP 处理程序之后发生。
 * • ReleaseRequestState:将会话状态重新存储在状态存储中。如果您要构建一个自定义会话状态模块,则必须将您
 *      的状态重新存储在状态存储中。
 * • UpdateRequestCache:此事件将输出重新写入输出缓存。如果您要构建自定义缓存模块,则可以将输出重新写入
 *      缓存中。
 * • EndRequest:请求已完成。您可能希望构建一个调试模块,以便将整个请求的信息收集到一起,然后将信息写入
 *      页面中。对于每个请求传输,模块都可以与下列事件同步。这些事件的顺序不是固定的。
 * • PreSendRequestHeaders:此事件在发送标头之前发生。如果您要添加其他标头,则可以通过自定义模块同步此事件。
 * • PreSendRequestContent:此事件在调用 Response.Flush 方法时发生。如果您要添加其他内容,则可以通过自定
 *      义模块同步此事件。
 * • Error:此事件在出现未处理的异常时发生。如果您要编写自定义的错误处理程序,请同步此事件。

 

 

以下为示例:

 

/// <summary>
    /// HelloWorldModule 创建自定义 HTTP 模块类
    /// </summary>
    public class HelloWorldModule : IHttpModule
    {
        public HelloWorldModule()
        {
        }

        #region 属性
        public string ModuleName
        {
            get { return "HelloWorldModule"; }
        }
        #endregion

        #region Init--初始化模块,并使其为处理请求做好准备
        /// <summary>
        /// In the Init function, register for HttpApplication events by adding your handlers.
        /// </summary>
        /// <param name="application"></param>
        public void Init(HttpApplication application)
        {
            application.BeginRequest += new EventHandler(this.Application_BeginRequest);
            application.EndRequest += new EventHandler(this.Application_EndRequest);
        }
        #endregion

        // Create HttpApplication and HttpContext objects to access
        // request and response properties.

        #region Application_BeginRequest
        private void Application_BeginRequest(Object source, EventArgs e)
        {

            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;
            context.Response.Write("<h1><font color='red'>HelloWorldModule:Beginning of Request</font></h1><hr>");
        }
        #endregion

        #region Application_EndRequest
        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;
            //context.Response.Write("<h1><font color='red'>HelloWorldModule:End of Request</font></h1><hr>");
            context.Response.Write("<h1><font color='red'>HelloWorldModule:End of Request</font></h1><hr>");
            context.Response.Write("<script language='JavaScript'>alert('HttpModule测试');</script>");
        }
        #endregion

        #region Dispose--处置由实现 IHttpModule 的模块使用的资源(内存除外)。
        /// <summary>
        /// Dispose--处置由实现 IHttpModule 的模块使用的资源(内存除外)。
        /// </summary>
        public void Dispose()
        {
        }
        #endregion

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值