ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:1.62MB ,
资源ID:6677      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-6677.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ASPNETMVC整体运行原理走源码.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

ASPNETMVC整体运行原理走源码.docx

1、ASPNETMVC整体运行原理走源码MVC那些不为人知的一些事情有好些理解是直接写在源码里的,然后通过截图,放到这个Word里面,所以图很重要,有图有证据嘛。有些不清晰的,就放大来看啦(Ctrl+滚轮上)哈哈MVC运行的整体机制整体路线:浏览器发送请求IIS捕获到请求,根据请求里面的信息找到对应的程序集加载程序集,创建运行环境包装请求信息(wr) 调用HttpRuntime的PR方法创建application(读取global文件,调用Application_Start方法)初始化(读取配置文件(用户+系统的),调用InitModlues()方法),第七个事件里注册了UrlRoutingMod

2、ules方法创建MvcHandler,它包含了请求上下文信息,路由信息,并将其添加到上下文HttpContext调用MvcHandler的PR方法,创建控制器,调用action(用户在Controller下面写的方法),将用户数据保存到父类里面。执行action返回ViewResult(包含了用户执行后的数据)拿取视图引擎,调用Render()方法,生成Html代码,创建视图。能力有限,没求甚解。愿互相学习,互相指正,共同进步。【你必须非常努力,才能看起来毫不费力!】ASP.NET和MVC.NET的区别从UrlRoutingModules这个方法说起。.NET 程序运行的时候,会先执行初始化,

3、也就是调用Global文件里的Application_Start方法。通过反射创建这个文件里的类(在ASP.NET里面就是Global类,在MVC下是MVCApplication类,它们继承自HttpApplication类。) 如果Global文件不存在,就直接创建他们的父类:HttpApplication。接着在确保调用了Application_Start方法后,创建ApplicationInstance实例(对象池),然后进行初始化。在.NETFrameWork 4.0,初始化时读取配置文件web.config(包括系统配置文件和用户自定义的配置文件)。在系统配置文件下有一个HttpMo

4、dules。内容如下:读取HttpModules节点,为其创建对应的对象,循环调用里面的Init方法,在这个方法里,向application里面的事件注册方法(用户的代码)。完成AOP编程。MVC 在配置文件里,写了一个UrlRoutingModule,创建这个方法,在这个方法里的Init方法里,向管道事件的第七个事件注册了一个方法。这个方法主要做的是将MVCHandler添加到上下文中(HttpContext).【下面这个图是从浏览器请求开始的】那么要研究MVC就从这个UrlRoutingModule(继承IHttpModule接口)方法开始研究。UrlRoutingModule类下的Ini

5、t()方法在第七个事件下注册了一个方法:这个方法里:1、 拿到HttpApplication对象,2、 将上下文对象HttpContext封装到HttpContextBase里面。3、 传入上下文对象,执行事件。-分割线- 1、 拿取路由数据。1.1根据上下文,进行过滤,判断请求的是不是一个已经存在的文件,如果是,则直接返回这个文件。1.2如果请求的不是存在的文件,那么获取路由数据。获取路由数据的时候,调用的是RouteBase类下面的GetRouteData(httpContext)方法。 1.2.1RouteBase下的GetRouteData方法,但是,实现这个方法的类是Route。继续

6、看GetRouteData()方法:因为在Reflector下不能写注释,我转到了MVC源码下面。到这里,是时候说明一下那个RouteHandler是哪里来的了。其实它就是MVCRouteHandler。我们到Global文件下去看。A:这里注册路由,调用MvcApplication下的RegisterRoutes方法。即BB:将路由信息传入到MapRoute下面,它其实就是返回一个Route对象回来。具体做了什么呢?上面我在1.2.2那里标记了一下,那个就是Route类的一个构造函数Route(string url,IRouteHandler routeHandler),然后在这里new了一

7、个Route对象,并传入了一个url和一个MvcRouteHandler对象,因此,到这里,可以知道routeHandler 就是MvcRouteHandler。而上面已经确定了,this就是Route,那么Route下的RouteHandler也就是MvcRouteHandler。参看1.2.3!在1.2.2里将routeHandler传给1.2.3的RouteHandler。我们接着说GetRouteData()方法。简单地说,GetRouteData就是拿取路由数据,将MvcRouteHandler添加到RouteData对象里RouteData data=new RouteData(t

8、his,this.RouteHandler).但是在里面做了一些检查,检查路径,检查约束。最后返回这个data。还是看一下RouteData里面的内容吧:这里面包含了MvcRouteHandler(RouteHandler),命名空间(dataTokens),路由数据?没去研究RouteValueDictionary()。反正这里包含了我们传进来的路由信息。保存在RouteCollection集合里面。 提一下: RouteTable 里也一个RouteCollection,静态的,是为了能够在整个生命周期里面使用到路由数据。如下图:接着我们继续看第二部分吧。2、 在第一部分里,已经将MvcR

9、outeHandler添加到了routeData里面,返回一个data对象。而MvcRouteHandler最后传递为RouteHandler。第二部分:IRouteHandler routeHandler = routeData.RouteHandler;从routeData里面获取到routeHandler对象。为什么是IRouteHandler类型呢? 擦,因为从Route构造函数开始就是IRouteHandler类型定义来接收的接着看第三部分3、 RequestContext requestContext = new RequestContext(context, routeData)

10、; context.Request.RequestContext = requestContext; 将context对象和上面拿到的路由数据routeData封装到RequestContext里面,然后赋值给HttpContextBase下的HttpRequestBase的requestContext属性。也就是将路由数据和封装过的上下文信息再添加到上下文里面。 IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);GetHttpHandler(requestContext) 这里返回一个MvcHandl

11、er。然后我们去MvcHandler下去看看,还是不看先,留到后面看吧。应该就是调用PR方法执行后面一系列流程了。留待后面揭秘。 暂时知道GetHttpHandler方法里返回这个MvcHandler对象就行了。 接收类型是IhttpHandler接口!熟悉啦接着看第四部分,也是在第七个事件里注册的方法执行的最后一步。context.RemapHandler(httpHandler);这个方法是把获得的那个MvcHandler添加到上下文对象中。这个方法具体做啥先。先得说一下,在第三部分的时候,已经将context传进了HttpContextBase里。待会用到HttpContextWrapp

12、er,它继承HttpContextBase,重写了HttpContextBase里面的ReMapHandler方法。详细见图:好了,进入ReMapHandler方法:Type type = handler.GetType();/获得类型:MvcHandlerhandlerType = type.AssemblyQualifiedName;/获得当前类型在程序集里面的名字:System.web.MVC.MvcHandlerhandlerName = type.FullName;/获得全名this._remapHandler = handler;/将MvcHandler添加到上下文对象中,这里的t

13、his就是HttpContext在第七个事件里注册的方法,最终就是拿到路由数据,将创建的Handler添加到上下文中。PostResolveRequestCache(HttpContextBase context)到此,运行完接着深入。在原来的ASP.NET 的整个运行周期上,挑中合适的时机,弄出分叉来,然后MVC.net诞生了。那么这个时机在哪里呢?1、 FrameWork 4.0下会先读取系统配置文件,这个文件下的节点HttpModules里配置了一个UrlRoutingModule,在读取这个配置文件的时候,就会创建这个Module对象,创建方法,在初始化的时候在第七个事件PostRes

14、olveRequestCache里注册方法,这个方法里面封装上下文和路由信息,创建了MvcHandler 并添加到上了下文里(HttpContex)。2、 在第八个事件(PostMapRequestHandler)执行时(是不是在执行的时候检查呢?还是在执行之前检查?这个还没有考证!),会先判断上面的那个_remapHandler 是不是空的,如果不空(MVC执行程序),就不再创建页面类对象,直接返回Handler。否则根据请求路径创建页面类对象等执行ASP.NET运行机制。以上两个时机造就了MVC。在创建的MvcHandler里有我们最常见的PR(ProcessRequest)方法.现在开始

15、揭秘MvcHandler到底干了什么。(只研究主要的)在ASP.net整个运行的管道第九个事件里要拿到请求的Session,会检查当前请求的类是否实现了IRequiresSessionState接口。再看MvcHandler类,它已经实现了这个接口!其实,这个MvcHandler就相当于是一个页面类对象。可以自己去该类下面看看。跟ASP.NET一样,在第十一和十二个事件之间会调用页面类对象的PR方法,ASP.NET里调用page(继承自IHttpHandler)类的PR(是实现IHttpHandler的)方法。在Mvc.Net里则调用MvcHandler(也继承自IHttpHandler)里的

16、PR(也是实现IHttpHandler的)方法。老样子,进入PR方法:1、创建一个控制器接口对象,在初始化的时候为其赋值。创建控制器!根据拿到的控制器的类型,创建的行为是由工厂完成的!工厂在这里起到的作用除了提供多态外,还提供一个对象池,每一次创建控制器的时候都会到这个池里面去检查。在ProcessRequestInit()方法里面:接着走下去,看CreateController()方法。不做太多的解释了,到Create()方法,再到Activitor下的CreateInstance方法。反正最终就是根据type创建出这个实例。见下面两个图:2、执行Execute()方法,这是一个很关键的方法

17、。在Initialize方法里:(this就是ControllerBase)主要看ExecuteCore()方法:好啦,走到这里终于到了调用Action了。在Action里面会存在一些与视图相关的东西。因此在action里面要创建视图(View()方法),设置数据,返回ViewResult从读取配置文件在第七个事件里注册方法,创建MvcHandler,将路由信息和请求上下文信息传进去MvcHandler为类页面类对象,调用里面的PR方法,通过反射创建controller对象,调用里面的Action。Action就是我们平时直接写代码的方法。返回一个ActionResult return Vie

18、w();So接下来研究Action,是怎么创建视图返回的,又是怎样设置保存后台数据等等1、 执行程序员的action方法,返回ActionResult:ViewResult就是authContext.Result。这些数据保存到HomeController的父类的父类ControllerBase里面,然后再在Controller类里面new了一个ViewResult,执行action的时候就返回这个ViewResult,将这些数据传递保存到ViewResultBase里面,以供创建视图的时候使用!2、 拿到ViewResult并保存到AuthContext里面(authContext.Result),开始执行ExecuteResult()方法!1、 FindView(context):111.1.11.1.1.1找RazorViewEngine:最终找到了FindView啦在FindView返回关联本地视图的引擎(啥?不懂),有母版页的时候的!或者创建一个新的视图引擎CreateView()在RazorViewEngine下面找到了CreateView()So拿到了视图引擎了,Public IView Viewset;get; 已经赋值,那么在Render()方法里面生成Html代码,并放入Response里哈,整一条路线终于清晰啦。MVC整个机制就到这里

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2