浅析ASP.NET HTTP Module
简要说明
最近半年一直在做一个项目,公司的前端MES系统.然后呢,最近又一直在考虑权限卡控的问题.于是就把之前看过的HTTP Module又重新研究了一番.记得很久之前就在一个同事面前,和其高谈阔论过HTTP模块的作用,至今仍历历在目.当时讨论的话题是如何做网站的统计分析,我说如果是ASP.NET的话,使用HTTP Module是一个很好的方式.因为HTTP模块可以重用呀.只要配置Web.config就可以啦,可以被多个网站重用,很适合公司目前的情况.然后还说了一番自己的见解,分析了一番ASP.NET应用程序的生命周期.最后结论是HTTP Module可以做,而且会比较方便的做.进一步拓展到如果不是ASP.NET的网站,那一样是可以做,只要重新配置一下IIS就可以啦.(嗯,注意哦这个讨论仅限于与Windows的IIS环境下哟).后来很长时间没有碰,那个网站统计分析的想法也没有去实践论证.发现自己啦~~~是个空想主义者 = =|| 好啦,总结一下HTTP Module,阶段性总结,梳理一下自己的知识.
HTTP模块概述
HTTP模块是一个在每次针对应用程序发出请求时调用的程序集.HTTP模块作为请求管道的一部分调用,它能够在整个请求过程中访问生命周期事件.因此,HTTP模块使您可以检查传入的请求并根据该请求进行操作.它们还使您可以检查传出的响应并修改它.所以HTTP模块通常具有以下用途:
安全
统计信息和日志记录
自定义的页眉或页脚
Url Rewrite
其实 ASP.NET使用模块来实现各个应用程序功能,其中包括Forms身份验证,缓存,会话状态和客户端脚本任务.
HTTP模块工作方式
模块必须经过注册才能从请求管道接收通知.注册HTTP模块的最常用发发就是在应用程序的web.config中进行注册.IIS 7.0有另外的注册方式.模块经过注册之后就可以在应用程序中工作.具体工作方式如下描述:
1、ASP.NET创建表示应用程序的HttpApplication类的实例时,将创建已注册的任何模块实例。
2、在创建模块实例时,将调用模块的Init方法并自行初始化。
3、在Init方法中,订阅需要的各种应用程序事件
4、当应用程序事件被引发时,将调用模块中的相应方法。
5、当模块的事件处理程序完成运行时,ASP会调用管道中的下一进程。这个可能是另一个模块,也可能是用于该请求的HTTP处理程序
HTTP模块与Global.asax文件
Global.asax 文件(也称为 ASP.NET 应用程序文件)是一个可选的文件,该文件包含响应 ASP.NET 或 HTTP 模块所引发的应用程序级别和会话级别事件的代码。
HTTP模块 | Global文件 | |
优点 | 模块可以封装,因此可以在创建一个次后在许多不同的应用程序中使用,通过将它们添加到全局程序集缓存并将它们注册到Machineconfig文件中,可以跨应用程序重新使用它们. | 在于可以处理其他已注册事件,如Session_Start和Session_End,此外Global文件还允许实例化可在整个应用程序中使用的全局对象. |
使用条件 | 希望在其他应用程序中重用该模块。 希望避免将复杂代码放在 Global.asax 文件中。 该模块应用于管道中的所有请求(仅限 IIS 7.0 集成模式)。 |
当必须订阅对于模块不可用的事件(如 Session_Start)时 创建依赖应用程序事件的代码并且不需要跨应用程序重用代码时 |
HTTP模块自定义的事件,可以在Global文件中订阅,比如说Session_Start,这个其实就是订阅了Session模块的Start事件.
简单的讲就是这样子的.我在模块中定义了一个Event(事件),那我这个事件的处理函数是什么哪?我何时注册该事件?
答:比如说我自定义了一个模块类叫SessionModule,然后这个模块里面我自定义了一个事件叫Start,使用Session的名字在web.config中注册该模块
那么在Global.asax中声明一个名称为:Session_Start 这样子的函数,这样子就注册了模块注册名为Session的Start事件啦
处理函数就是刚才定义的名称为 Session_Start 的函数.
创建自定义HTTP模块的步骤
1、创建实现IHttpModule接口的类。
2、为Init方法编写一个处理程序。初始化方法应该初始化模块并订阅所需的任何应用程序事件。
3、为已经订阅的事件编写代码。
4、如果模块需要清理,还可选择实现Dispose方法。
5、在Web.config文件中注册模块.
请继续关注~~实现了自定义页眉和页脚的一个简单的HTTP模块