楔子:
用笔头代替记性是一个比较保险的方法,用写博客代替日记本是一个双赢的途径.那么,现在开始偶的第一个系列连载——庖丁解牛之ASP.NET MVC,有点标题党,算是自我勉励吧,HOHO
正文:
www.asp.net/mvc下载MSI,安装完后,吼一声,热身完毕,干活。
从WebRequest开始说起,破处的当然是IIS,然后是HttpApplication,接下来就是Http Module,呐,正主出场!
看Web.Config里httpModules的配置: <add name="UrlRoutingModule" … />,是啦,接下来,WebRequest被送给了System.Web.Route.UrlRoutingModule,并进行了一道初加工。
首先是通过RouteCollection匹配一个注册的route,并将相关数据通过RouteData的一个实例返回,RouteData里有个类型为MvcRouteHandler的属性RouteHandler。再通过这个属性抠出一个MvcHandler的实例,至此终于和MVC中的Controller搭上边了,看MvcHandler的ProcessRequest方法的源代码:
逻辑很清晰,先淫荡的写入了一些Http头信息,接着获取控制器名称,创建控制器,执行,释放。
淫荡的咱们就自个儿晚上偷偷研究好了,转到创建控制器上,由DefaultControllerFactory的CreateController来做包工头,下面俩苦工,分别是GetControllerType和GetControllerInstance.
GetControllerType方法的主要逻辑是获得一个命名空间的集合交与ContrllerTypeCache进行匹配。其中由三个步骤,先是检查RouteData中的命名空间集合,如果没有匹配的,那么用程序的默认命名空间集合(ControllerBuilder.DefaultNamespaces)匹配,还是没有的话就找出所有已引用的程序集的命名空间进行匹配。在这里需要注意的,一般情况下多是第三种情况,也是消耗最大的。所以建议在注册Route的时候同时也注册控制器命名空间,如:
OK,找到了Controller Type,实例化一下,那么创建控制器就完成了。接着就是Action Time,不过得留到下篇了,^_^。
Notes:
1. 除了MvcHandler还有个MvcHttpHandler,打破头也不知道应用在哪里,在Mvc源码里除了类本身就没有其他地方引用了。MvcHttpHandler是继承自UrlRouteHandler,并且在创建项目的时候在Web.Config文件里配置了的。所以是不是用来响应那些不需要整个VIEW的Http请求的?还请各位指导。
2. 在这篇涉及到的逻辑中,感觉只有注册Route的时候可以DIY一下,自己写个继承自IRouteHandler的route处理器,写个类似MapRoute的扩展方法,这样可以在Route初始化的时候做一些事情,至于具体什么事情还没想到,谁想到了一定要共享哦,否则…嘿嘿….



}
浙公网安备 33010602011771号