IHttpModule接口

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

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():它可以在进行垃圾回收之前进行一些清理工作。

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 Module向Http请求输出流中写入文字

本例中,我们仅用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请求的输入流中分别写入不同的内容。

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

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

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

<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)。

时间: 2024-10-14 00:58:02

IHttpModule接口的相关文章

.net实现IHttpModule接口顾虑器

这篇文章主要介绍了C#使用IHttpModule接口修改http输出的方法,涉及C#操作IHttpModule接口的相关技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了C#使用IHttpModule接口修改http输出的方法.分享给大家供大家参考.具体实现方法如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 using System; usi

实现IHttpModule接口,给每个页面输出一段脚本

在App_Code文件中添加TGModule.cs using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControl

asp.net实现IHttpModule接口注意事项

IHttpModule向实现类提供模块初始化和处置事件. IHttpModule包含兩個方法: public void Init(HttpApplication context);public void Dispose(); Init():这个方法接受一个HttpApplication对象,HttpApplication代表了当前的应用程序,我们需要在这个方法内注册 HttpApplication对象暴露给客户端的事件.可见,这个方法仅仅是用来对事件进行注册,而实际的事件处理程序,需要我们另外写

IHttpModule与IHttpHandler的区别整理

IHttpModule与IHttpHandler的区别整理1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的2.对请求的处理上:IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.3

【IHttpHandler】IHttpModule实现URL重写

1.用自定义IHttpModule实现URL重写 一般来说,要显示一些动态数据总是采用带参数的方式,比如制作一个UserInfo.aspx的动态页面用于显示系统的UserInfo这个用户信息表的数据,那么需要在其后带上一个参数来指定要显示的用户信息,比如UserInfo.aspx?UserId=1用于显示表中编号为1的用户的信息,如果为2则显示表中编号为2的用户信息.在一些系统中我们可能看到的不是这样的效果,可能会看到形如UserInfo2.aspx这样的形式(当然形式可以多样,只要有规律就行)

利用 IHttpModule 自定义 HTTP 处理模块

本文内容 引入 IHttpModule 概述 创建自定义 HTTP 模块的步骤 演示创建自定义 HTTP 模块 HTTP 模块的工作方式 HTTP 模块与 Global.asax 文件 参考资料 引入 本文在 VS 2008 和 IIS 6 环境下概述如何利用 IHttpModule 自定义 HTTP 模块. 当我们在 VS 2008 里新建一个 Web 应用程序项目后,会在 Web.config 文件看到如下一个配置: <httpModules> <add name="Scr

IHttpModule在webconfig中的注册

在asp.net中,提供了两种方式用来解决获取由asp.net服务器创建和维护的HttpApplication对象,方便注册HttpApplication对象的事件处理.这两种方式为:IHtpModule和global.asax方式.这两种方式相同点核心都是IHttpModule接口. 通过IHttpModule接口创建HttpApplication的事件处理程序 该接口在命名空间System.Web下,专门用来定义HttpApplication对象的事件处理. 实现该接口的类称为HttpMod

asp.net IHttpModule浅析

在asp.net程序中,我们除了使用系统自带的HttpModule模块,还可以自己定义一些自己的HttpModule接口模块.一个asp.net程序可以接收多个HttpModule模块. 众所周知,asp.net web有19个管道事件,我们除了可以在Global.asax中实现其中的某些管道事件,还可以通过IHttpModule接口实现这些管道事件. 一.定义自己的HttpModule模块 新建一个framework类库项目,新增一个OutsideMyModule类,并继承IHttpModul

扩展 IHttpModule

上篇提到请求进入到System.Web后,创建完HttpApplication对象后会执行一堆的管道事件,然后可以通过HttpModule来对其进行扩展,那么这篇文章就来介绍下如何定义我们自己的module来实现对项目的一些扩展. 先看一下IHttpModule的接口源码,只有Dispose()和Init(HttpApplication context)这两个方法,从方法名称我们就可以知道Dispose方法是用来释放资源的,而Init方法自然就是用来初始化的,一般仅用于给期望的HttpAppli