IHttpModule接口

IHttpModule向实现类提供模块初始化和处置事件。
IHttpModule包含兩個方法:web

public void Init(HttpApplication context);
public void Dispose();

Init():这个方法接受一个HttpApplication对象,HttpApplication表明了当前的应用程序,咱们须要在这个方法内注册 HttpApplication对象暴露给客户端的事件。可见,这个方法仅仅是用来对事件进行注册,而实际的事件处理程序,须要咱们另外写方法。

整个过程很好理解:

1.       当站点第一个资源被访问的时候,Asp.Net会建立HttpApplication类的实例,它表明着站点应用程序,同时会建立全部在Web.Config中注册过的Module实例。
2.       在建立Module实例的时候会调用Modul的Init()方法。
3.       在Init()方法内,对想要做出响应的HttpApplication暴露出的事件进行注册。(仅仅进行方法的简单注册,实际的方法须要另写)。
4.       HttpApplication在其应用程序周期中触发各种事件。
5.       触发事件的时候调用Module在其Init()方法中注册过的方法。

Dispose():它能够在进行垃圾回收以前进行一些清理工做。app

public class ModuleDemo:IHttpModule
{
    public void Init(HttpApplication context) {
        // 注册HttpApplication应用程序 BeginRequest 事件
        // 也能够是其余任何HttpApplication暴露出的事件
        context.BeginRequest += new EventHandler(context_BeginRequest);
    }

    void context_BeginRequest(object sender, EventArgs e) {
        HttpApplication application = (HttpApplication)sender;
        HttpContext context = application.Context;
        // 作些实际的工做,HttpContext对象都得到了,剩下的基本能够自由发挥了
    }

    public void Dispose() {
    }
}

经过
Http ModuleHttp请求输出流中写入文字
spa

本例中,咱们仅用BeginRequest事件和 EndRequest 事件对 Http Module 的使用做以说明。咱们经过这个范例,了解 Http Module 基本的使用方法。对象

首先,请建立一个新的站点,在App_Code目录中添加类文件: ModuleDemo.cs:事件

public class ModuleDemo:IHttpModule
{
    // Init方法仅用于给指望的事件注册方法
    public void Init(HttpApplication context) {
        context.BeginRequest += new EventHandler(context_BeginRequest);
        context.EndRequest += new EventHandler(context_EndRequest);
    }

    // 处理BeginRequest 事件的实际代码
    void context_BeginRequest(object sender, EventArgs e) {
        HttpApplication application = (HttpApplication)sender;
        HttpContext context = application.Context;
        context.Response.Write("<h1 style='color:#00f'>来自HttpModule 的处理,请求到达</h1><hr>");
    }

    // 处理EndRequest 事件的实际代码
    void context_EndRequest(object sender, EventArgs e) {
        HttpApplication application = (HttpApplication)sender;
        HttpContext context = application.Context;
        context.Response.Write("<hr><h1 style='color:#f00'>来自HttpModule的处理,请求结束</h1>");
    }
       
    public void Dispose() {
    }
}资源

上面的代码很简单,它注册了 HttpApplication实例的 BeginRequest 事件 和 EndRequest事件,事件处理方法的做用仅仅是在http请求开始和结束的时候,给http请求的输入流中分别写入不一样的内容。it

接下来在 Web.config 的 System.web 结点中写入如下内容:io

<system.web>
    <httpModules>
        <add name="MyModule" type="ModuleDemo" />
    </httpModules>
</system.web>class

在这册咱们本身的http module 时,假设类名为ModuleDemo,位于myNameSpace命名空间下,程序集名称为myDll,咱们只需将myDll.dll拷贝到Bin目录下,并在站点的 web.config 文件 system.web 结点下建立 httpModules 结点: module

<system.web>
    <httpModules>
        <add name="CustomModuleName" type="myNameSpace.ModuleDemo, myDll"/>
    </httpModules>
</system.web>

type属性由分号“,”分为两部分,前面是命名空间及类名,也就是类型名;后面是程序集名。若是咱们将代码建立在App_Code目录中,则不须要再指定程序集名。

name属性由咱们本身命名,不必定与类名相同,此处我将它命名为“CustomModuleName”。咱们能够经过应用程序(HttpApplication) 的Modules属性获取HttpModuleCollection集合,而后经过name属性,进一步获取HttpModule对象。

经过name属性,咱们还能够在global.asax中文件中编写自定义HttpModule暴露出的事件的处理程序,它采用的格式是:void ModuleName_EventName(object sender, EventArgs e)。

相关文章
相关标签/搜索