ASP.NET MVC Module
ASP.NET MVC Module
前言
在ASP.NET中管道模型是怎么来实现的?在请求处理流程一文中大概的讲述了Http Module和HttpApplication之间的关系,而并没有涉及到Http Module怎么去实现和注冊。Http Module的意义非常大,ASP.NET MVC框架怎么捕获请求的?或者换一种方式来说ASP.NET MVC框架的入口点在哪里?
Http Module注冊使用
我们直接进入主题来看一下自己定义的实现,首先在Module使用之前我们要先定义个Module,定义非常easy,定义个类型而且实现IHttpModule接口演示样例代码1-1
代码1-1
1 public class CustomModule:IHttpModule 2 { 3 public void Dispose() 4 { 5 throw new NotImplementedException(); 6 } 7 8 public void Init(HttpApplication context) 9 { 10 context.BeginRequest += new EventHandler(context_BeginRequest); 11 context.EndRequest += new EventHandler(context_EndRequest); 12 } 13 14 void context_EndRequest(object sender, EventArgs e) 15 { 16 ((HttpApplication)sender).Context.Response.Write("<h1>请求处理结束后进入自己定义Module</h1>"); 17 } 18 19 void context_BeginRequest(object sender, EventArgs e) 20 { 21 ((HttpApplication)sender).Context.Response.Write("<h1>请求处理開始前进入自己定义Module</h1><hr>"); 22 } 23 }
这个时候我们自己定义的Module就已经定义好了,在CustomModule类型的 Init()方法中是订阅了HttpApplication的事件,在请求处理流程文中说过,这里不作解说了。
这个时候执行程序是不行的,ASP.NET有天大的本事也不知道你自己自己定义了一个Module的阿,你得告诉它我这有个自己定义的Module,执行的时候要执行我的这个Module。
如今我们来把Module注冊到系统中,打开项目中的Web.config配置文件,找到<system.web>节点加入<httpModules>节点.
代码1-2
<system.web> <httpModules> <add name="MyCustomModule" type="MvcApplication.CustomModule,MvcApplication"/> </httpModules> </system.web>
这里要说的是Name属性“MyCustomModule”值仅仅是Module注冊到系统的名称,可通过HttpApplication实例对象.Modules["MyCustomModule"]的方式依据Name获取到已经注冊到系统中的Module
Type属性值则为自己定义的CustomModule类型所在的命名空间已经类型名称,逗号后面的值为CustomModule类型所在的程序集名称。
这个时候还是不能执行程序的,由于博主的演示样例程序是使用MVC框架的项目,所以要加入一个空的控制器和一个视图。
- 右击Controllers目录加入->控制器,设置名称为HomeController,设置控制器模板为空控制器,单击确定后,会看到控制器中有个默认的Index()方法。
- 右击Index()方法名称,选择加入视图后弹出对话框点击加入就可以。
- 加入 <h2>自己定义Module演示</h2><hr /> 到视图
这样我们再看一下项目的执行结果:
图1
UrlRoutingModule
这里要说的UrlRoutingModule类型就是一个系统定义的Module,为什么要解说它呢?由于从它里面能够看到系统的扩展点,也由于它是路由系统和MVC框架的连接点。
依据前面的篇幅对于路由的学习,能够说是对路由有了一个基础的认识,大家都知道请求的Url会去匹配系统的定义的路由模式,然后获得一个RouteData这么一个对象实例,然后依据它里面的信息来进行对控制器的生成操作等等兴许的一些行为。
我们来看图1来理解UrlRoutingModule的作用,也许在实际项目开发中不会自己去扩展这部分内容,可是多了解一下也没有坏处。
图2
UrlRoutingModule类型的内部大概实现如代码1-3
代码1-3
1 void context_PostResolveRequestCache(object sender, EventArgs e) 2 { 3 HttpApplication context = sender as HttpApplication; 4 HttpContextWrapper contextWrapper = new HttpContextWrapper(context.Context); 5 6 RouteData routeData = RouteTable.Routes.GetRouteData(contextWrapper); 7 8 RequestContext requestContext = new RequestContext(contextWrapper, routeData); 9 IHttpHandler httpHandler = routeData.RouteHandler.GetHttpHandler(requestContext); 10 httpHandler.ProcessRequest(context.Context); 11 }
IRouteHandler、IHttpHandler
在上面的代码1-3中,httpHandler变量是通过RouteData对象下的RouteHandler属性里的GetHttpHandler()方法来依据请求上下文对象RequestContext获取的。
这里捎带一句,关于RequestContext类型(不是对象类型,是參数上下文类型)在MVC兴许的学习中会常常见到,这也算是一种开发中的模式吧,RequestContext对象中封装了HttpContextBase对象和RouteData对象。
接着刚才的话题,MvcRouteHandler类型已经实现了IRouteHandler类型,细心的朋友在阅读前面的文章会发现,在MVC中注冊路由的时候为每一个自己定义路由规则(也就是Route对象)实例化的时候是用默认的MvcRouteHandler类型,从而会转变到RouteData的RouteHandler属性里,在MvcRouteHandler类型的默认实现里,GetHttpHandler()方法返回的是MvcHandler,然后就像上面所说的那样。在IHttpHandler接口中定义了一个ProcessRequest()方法,这种方法就是MVC框架中请求->路由->控制器的一个过程。这部分内容会在控制器部分说明。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。