学习笔记
ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pipeline中各个HttpModule的处理,最后将HTML发送到客户端浏览器中。
生命周期中涉及到几个非常重要的对象:HttpHandler,HttpModule,IHttpHandlerFactory
题外话
HttpModule和HttpHander
页面处理程序在处理过程中,则要经历HttpModule,HttpHandler的处理:
前者HttpModule用于页面处理前和处理后的一些事件的处理,后者HttpHandler进行真正的页面的处理
如前所说,HttpModule会在页面处理前和后对页面进行处理,所以它不会影响真正的页面请求
HttpModule与IHttpHandler的区别
1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的
2.对请求的处理上:
IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.
IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.
3.IHttpHandler按照你的请求生成响应的内容,IHttpModule对请求进行预处理,如验证、修改、过滤等等,同时也可以对响应进行处理
在Web.config中配置(经典模式下不可行哦)
1.定义继承了IHttpModule类
2.注册事件
3.在Web.config配置
创建类
public class MyHttpMoudle:IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += context_BeginRequest;
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
if (app != null)
{
app.Context.Response.Write("你好啊");
}
}
public void Dispose()
{
}
}
配置
在System.Web节点下
<httpModules>
<add name="Test" type="Webs复习.Util.MyHttpMoudle"/>
</httpModules>
这样就将自定义的HttpModule类MyHttpModule插入到了当前web的HttpModule的Pipeline中。 HttpModule主要功能是对Application的各个事件进行截取,在这些事件中完成自己的处理。其实如果自己开发一些项目,直接在 Global.asax中处理已经足够了。如果是开发一个Framework或者是某些方面的组件,需要在事件中添加处理,开发自定义
的 HttpModule,可以避免使用Framework或者组件时,还得手工在Global.asax中添加代码。目前想到的开发自定义HttpModule的用途,有全局的身份/权限验证、自定义网站访问/操作日志的记录、处于管理/调试等目的对站点进行监控追踪等。
动态注册HttpModule
如果我们不想很麻烦的在配置文件里就进行配置,我们可以动态的配置。HttpApplication在初始化的时候会初始化所有配置文件里注册的HttpModules,当然这个也是第一种的,不过还好,第二种动态加载在没有读取配置文件,也就是没有编译之前也可以完成添加HttpModule的功能,因为,读取配置文件是在HttpApplication的处理过程,所以应该能想到如果想添加HttpModule肯定在创建HttpApplication之上,事实上也正是这样。就是在HostingEnvironment这个类中
ASP.NET MVC3发布的时候提供了一个Microsoft.Web.Infrastructure.dll文件,这个文件就是提供了动态注册HttpModule的功能
该程序集的静态类DynamicModuleUtility里面有个RegisterModule是可以将我们定义的HttpModule类添加进去的
不过通过查看方法具体过程是这样的
1。创建实现了IHttpModule的类
2.程序集标记为PreApplicationStartMethodAttribute特性
3.创建一个类,里面包含一个静态方法,注册自定义的类
因为HostingEnvironment的一个方法会遍历应用程序下的所有程序集
判断如果程序集标记为PreApplicationStartMethodAttribute特性,就会执行这个特性里指定的方法(静态方法)
具体实现过程如下
定义类
public class MyHttpMoudle:IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += context_BeginRequest;
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
if (app != null)
{
app.Context.Response.Write("自定义HttpModule");
}
}
public void Dispose()
{
}
}
中间类(里面包含了一个静态的注册方法)
public class RegisterModules
{
private static bool hasLoad;
public static void LoadPre()
{
if (!hasLoad)
{
hasLoad = true;
//命名空间 Microsoft.Web.Infrastructure.DynamicModuleHelper;
DynamicModuleUtility.RegisterModule(typeof(MyHttpMoudle));
}
}
}
最后按照要求添加特性如下
[assembly: PreApplicationStartMethod(typeof(RegisterModules), "LoadPre")]
运行结果
总结:
1、配置HttpModule的方式有两种,一种直接在Web.config添加,第二种 动态的配置,不过需要引入程序集
2、需求不是很大的话我们可以直接使用Global.asax配置
3、动态加载注册自定义HttpModule只能使用一次