namespace MyTestMVC { public class TestMyModule:IHttpModule { public void Dispose() { //throw new NotImplementedException(); } public void Init(HttpApplication app) { //事件注册 app.BeginRequest += app_BeginRequest; app.EndRequest += app_EndRequest; } void app_EndRequest(object sender, EventArgs e) { var app = (HttpApplication)sender; app.Context.Response.Write(); } void app_BeginRequest(object sender, EventArgs e) { var app = (HttpApplication)sender; app.Context.Response.Write(); } } }
在Init方法里面,通过HttpApplication对象来注册请求的事件。这样,每次发起一次http请求的时候都进到这两个方法。
当然,这些注册就能执行了吗?想得美,系统哪里知道你这个自定义HttpModule的存在,所以必须要在Web.config里面声明一下。
出现结果:
查阅资料后发现,原来IIS经典模式下必须要这样配置:
没办法,用微软的东西就要遵守别人的游戏规则。改成这样之后得到结果:
文中的“你好”来自这里:
既然HttpModule是事件注册机制的,那么如果需要在同一个事件里面去实现不同的功能,也就是说同一个事件注册多次是否可行呢?我们来试一把:
假如TestMyModule.cs这个自定义Module的作用是功能检查:
public class TestMyModule:IHttpModule { public void Dispose() { //throw new NotImplementedException(); } public void Init(HttpApplication app) { //事件注册 app.BeginRequest += app_BeginRequest; app.EndRequest += app_EndRequest; } void app_EndRequest(object sender, EventArgs e) { var app = (HttpApplication)sender; app.Context.Response.Write(); } void app_BeginRequest(object sender, EventArgs e) { var app = (HttpApplication)sender; app.Context.Response.Write(); //功能检查的处理逻辑... } }
TestMyModule.cs然后新建一个TestMyModule2.cs这个自定义Module,去实现请求拦截的功能:
public class TestMyModule2:IHttpModule { public void Dispose() { //throw new NotImplementedException(); } public void Init(HttpApplication app) { //事件注册 app.BeginRequest += app_BeginRequest; app.EndRequest += app_EndRequest; } void app_EndRequest(object sender, EventArgs e) { var app = (HttpApplication)sender; app.Context.Response.Write(); } void app_BeginRequest(object sender, EventArgs e) { var app = (HttpApplication)sender; app.Context.Response.Write(); //请求拦截的处理逻辑.... } }
TestMyModule2.cs最后在Web.config里面配置两个Module:
得到结果:
这说明同一个事件可以注册多次,即可以在同一个事件里面做不同的事。
3、HttpModule和HttpHandler如何区分通过上文的HttpModule的应用,我们看到在Init方法里面可以拿到当前应用的HttpApplication对象,拿到这个貌似就可以拿到当前请求上下文里面的Request、Response了,是不是就可以处理当前的http请求了,从这点上来说,HttpModule也能处理http请求,或者说具有处理http请求的能力。既然HttpHandler和HttpModule都可以处理http请求,那在使用的时候如何区分呢?上文说过,HttpModule的作用类似AOP,是针对某些通用功能(请求拦截、身份认证、检查功能)的,而HttpHandler常用来处理某一类(ashx、aspx、asmx)http请求,两者的侧重点不同,至于具体在实际中如何使用,你可以自行考量。
4、UrlRoutingModule解析好了,上面介绍那么多HttpModule的使用,都是在为了解Mvc里面的UrlRoutingModule做铺垫。上文说过UrlRoutingModule的作用是拦截请求,那么它是如何做的呢,还是来反编译看看吧。