HTML5技术

MVC系列——MVC源码学习:打造自己的MVC框架(一) - 懒得安分(4)

字号+ 作者:H5之家 来源:H5之家 2016-10-27 13:00 我要评论( )

namespace MyTestMVC{ public class TestMyModule:IHttpModule{ public void Dispose(){ // throw new NotImplementedException(); } public void Init(HttpApplication app){ // 事件注册 app.BeginRequest += app

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的作用是拦截请求,那么它是如何做的呢,还是来反编译看看吧。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 深究angularJS系列 - 初识 - 雨夜羽翼

    深究angularJS系列 - 初识 - 雨夜羽翼

    2016-10-27 11:00

  • Bootstrap框架系列 - 初识 - 雨夜羽翼

    Bootstrap框架系列 - 初识 - 雨夜羽翼

    2016-10-26 16:00

  • Ionic2系列-将beta升级到RC1 - yan_xiaodi

    Ionic2系列-将beta升级到RC1 - yan_xiaodi

    2016-10-19 11:00

  • css3 3d效果及动画学习 - 禾女小姐

    css3 3d效果及动画学习 - 禾女小姐

    2016-10-16 16:00

网友点评