MVC那些不为人知的一些事情
有好些理解是直接写在源码里的,然后通过截图,放到这个Word里面,所以图很重要,有图有证据嘛。有些不清晰的,就放大来看啦(Ctrl+滚轮上)哈哈···
MVC运行的整体机制整体路线:
浏览器发送请求
→IIS捕获到请求,根据请求里面的信息到对应的程序集
→加载程序集,创建运行环境
→包装请求信息(wr)
→调用HttpRuntime的PR方法创建application(读取global文件,调用Application_Start方法) →初始化(读取配置文件(用户+系统的),调用InitModlues()方法),第七个事件里注册了UrlRoutingModules方法
→创建MvcHandler,它包含了请求上下文信息,路由信息,并将其添加到上下文HttpContext →调用MvcHandler的PR方法,创建控制器,调用action(用户在Controller下面写的方法),将用户数据保存到父类里面。
→执行action返回ViewResult(包含了用户执行后的数据)
→拿取视图引擎,调用Render()方法,生成Html代码,创建视图。
→能力有限,没求甚解。愿互相学习,互相指正,共同进步。
【你必须非常努力,才能看起来毫不费力!】
ASP.NET和MVC.NET的区别从UrlRoutingModules这个方法说起。
.NET 程序运行的时候,会先执行初始化,也就是调用Global文件里的Application_Start方法。通过反射创建这个文件里的类(在ASP.NET里面就是Global类,在MVC下是MVCApplication 类,它们继承自HttpApplication类。) 如果Global文件不存在,就直接创建他们的父类:HttpApplication。
接着在确保调用了Application_Start方法后,创建ApplicationInstance实例(对象池),然后进行初始化。
在.NETFrameWork 4.0,初始化时读取配置文件fig(包括系统配置文件和用户自定义的配置文件)。
在系统配置文件下有一个HttpModules。内容如下:
读取HttpModules节点,为其创建对应的对象,循环调用里面的Init方法,在这个方法里,向application里面的事件注册方法(用户的代码)。完成AOP编程。
MVC 在配置文件里,写了一个UrlRoutingModule,创建这个方法,在这个方法里的Init方法里,向管道事件的第七个事件注册了一个方法。这个方法主要做的是将MVCHandler添加到上下文中(HttpContext).【下面这个图是从浏览器请求开始的】
那么要研究MVC就从这个UrlRoutingModule(继承IHttpModule接口)方法开始研究。
UrlRoutingModule类下的Init()方法在第七个事件下注册了一个方法:
这个方法里:
1、拿到HttpApplication对象,
2、将上下文对象HttpContext封装到HttpContextBase里面。
3、传入上下文对象,执行事件。
---------------------------------------------------------分割线------------------------------------------------------
asp网页源码
1、拿取路由数据。
1.1根据上下文,进行过滤,判断请求的是不是一个已经存在的文件,如果是,则直接返回这个文件。
1.2如果请求的不是存在的文件,那么获取路由数据。
获取路由数据的时候,调用的是RouteBase类下面的GetRouteData(httpContext)方法。
1.2.1RouteBase下的GetRouteData方法,但是,实现这个方法的类是Route。
继续看GetRouteData()方法:
因为在Reflector下不能写注释,我转到了MVC源码下面。
到这里,是时候说明一下那个RouteHandler是哪里来的了。
其实它就是MVCRouteHandler。我们到Global文件下去看。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。