MVC4 源码分析(Visual studio 2012/2013)

HttpModule中重要的UrlRoutingModule

9:this.OnApplicationPostResolveRequestCache);

10:this.PostResolveRequestCache(context);

IRouteHandler routeHandler = routeData.RouteHandler; //根据路由数据创建出了MvcRouteHandler

IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);

根据MvcRouteHandler创建出了MvcHandler:IHttpHandler(MvcHandler实现了IHttpHandler接口,接下来就要进入MVC源代码分析)

在MVC4源代码src文件夹System.Web.Mvc类库下

MVC4百度云源代码:链接:http://pan.baidu.com/s/1pLDvXB9  密码:4tiv

Reflector7百度云盘:链接:http://pan.baidu.com/s/1eSm9Y06  密码:gyx0

1:routeHandler.GetHttpHandler(requestContext);

2:MvcHandler.cs  ProcessRequest方法

通过工厂模式创建MVC中的Controller控制器,然后执行Execute方法

3:controller.Execute(RequestContext);

IController是接口,需要找具体实现类(之前通过工厂模式创建Controller控制器,优先去找Controller类)

Controller : ControllerBase  //Controller并没有实现IController接口,找其父类

ControllerBase : IController  //ControllerBase实现了IController接口

4:ExecuteCore()  //Controller类中

5:ActionInvoker.InvokeAction(ControllerContext, actionName)方法

ControllerActionInvoker : IActionInvoker  //ControllerActionInvoker 实现了IActionInvoker  接口

6:InvokeActioin

1:InvokeActionMethodWithFilters

1.1:InvokeActionMethod

2:InvokeActionResultWithFilters

2.1:InvokeActionResultFilterRecursive

2.2:InvokeActionResult

7:actionResult.ExecuteResult(controllerContext);

ViewResult : ViewResultBase   //ViewResult 并没有实现ActionResult接口,找其父类

ViewResultBase : ActionResult  //ViewResultBase实现了ActionResult接口

8:View.Render(viewContext, writer); 渲染View视图【WebForm.aspx视图引擎】

WebFormView : BuildManagerCompiledView  //WebFormView 并没有实现IView接口,找其父类

BuildManagerCompiledView : IView  //BuildManagerCompiledView实现了IView接口

8.1:BuildManagerCompiledView (WebForm.aspx视图引擎模式)

RenderView为抽象类,由其子类实现具体方法内容

执行ASP.NET 页面生命周期ProcessRequest方法,把后续第13/第14等事件执行完毕,然后把Render渲染好的所有html代码返回给浏览器

Application  19事件

ASP.NET MVC源码分析

1:获取ControllerFacotry,根据上下文反射Controller对象

  在Mvchandler的PR方法中

2:调用controller.Execute方法

  在MvcHandler的PR方法中

3:调用ActionInvoker.InvokeAction方法

  当前Controller类 -->ControllerBase类的Execute方法-->Controller类的ExecuteCore方法

4:调用InvokeActionResultWithFilter

  ActionInvoker对象为ControllerActionInvoker类的实例

5:调用actionResult.ExecuteResult

6:调用View.Render方法,将页面渲染到输出流中

  ViewResult类-->ViewResultBase类

当一个asp.net mvc应用程序提出请求,为了响应请求,包含一些请求执行流程步骤!在asp.net mvc应用程序Http request和Http Response过程中,

主要包含8个步骤:

1>RouteTable(路由表)的创建

2>UrlRoutingModule 请求拦截

3>Routing engine 确定route

4>route handler 创建相关的IHttpHandler实例

5>IHttpHandler实例确定Controller(控制器)

6>Controller执行

7>一个视图引擎创建

8>视图呈现

ASP.NET MVC源码分析的更多相关文章

  1. asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证

    原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...

  2. asp.net mvc源码分析-ModelValidatorProviders 客户端的验证

    几年写过asp.net mvc源码分析-ModelValidatorProviders 当时主要是考虑mvc的流程对,客户端的验证也只是简单的提及了一下,现在我们来仔细看一下客户端的验证. 如图所示, ...

  3. ASP.NET MVC 源码分析(一)

    ASP.NET MVC 源码分析(一) 直接上图: 我们先来看Core的设计: 从项目结构来看,asp.net.mvc.core有以下目录: ActionConstraints:action限制相关 ...

  4. asp.net MVC 源码分析

    先上一张图吧 asp.net请求机制的图  by传智播客邹华栋老师 然后是 邹老师添加MVC请求过程的图 其实MVC 是在.netframework上加了一个过滤器  HttpModule 在C:\W ...

  5. asp.net mvc源码分析-Route的GetRouteData

    我知道Route这里东西应该算路由,这里把它放到mvc里面有些不怎么合适,但是我想大家多数遇到路由都是在mvc的时候吧.首先我们还是来看看GetRouteData方法吧 [csharp] public ...

  6. asp.net mvc源码分析-Action篇 IModelBinder

    我们首先还是看看ReflectedParameterBindingInfo的Binder属性吧: public override IModelBinder Binder {            ge ...

  7. ASP.NET MVC源码分析系列

    Controller下的JsonResult的ExecuteResult方法 public override void ExecuteResult(ControllerContext context) ...

  8. ASP.NET MVC 源码分析(二) —— 从 IRouteBuilder认识路由构建

    我们来看IRouteBuilder的定义: public interface IRouteBuilder { IRouter DefaultHandler { get; set; } IService ...

  9. ASP.NET WebForm / MVC 源码分析

    浏览器 Url:https//localhost:6565/Home/Index ,https//localhost:6565/WebForm1.aspx,请求服务器(构建请求报文,并且将请求报文发送 ...

随机推荐

  1. 手把手教你_android自己主动化实践方案选型

    接到一个android自己主动化的任务,看了看手中的家伙:ranorex,appium,uiautomator 当然先捡商用的试试,简单呀,能够录制回放,只是不是抱特别大的期望,这个爷比較娇气,要是a ...

  2. 使用简单的 5 个步骤设置 Web 服务器集群

    通过在多个处理器之间分担工作负载并采用多种软件恢复技术,能够提供高度可用的环境并提高环境的总体 RAS(可靠性.可用性和可服务性).可以得到的好处包括:更快地从意外中断中恢复运行,以及将意外中断对终端 ...

  3. callback用法简介

    源地址:https://argcv.com/articles/2669.c callback,函数的回调,从ANSI C开始,一直被广为使用.无论是windows API的所谓消息机制,动态链接库的调 ...

  4. 浅谈Base64编码

    浅谈Base64编码 我打赌当你见到Base64这个词的时候你会觉得在哪里见过,因为在你能够上网看到这篇文章的时候你已经在后台使用它了.如果您对二进制数有所了解,你就可以开始读它了. 打开一封Emai ...

  5. 让自己的软件实现拖拽打开文件(使用WM_DROPFILES消息和DragQueryFile函数)

    //声明 protected procedure WMDROPFILES(var Msg : TMessage); message WM_DROPFILES; //实现 procedure TForm ...

  6. win7+vs2008+opencv

    1.下载安装VS2008,然后直接下载opencv的windows的安装版, 2.把opencv解压出来,我的路径为:D:\Program\opencv 3.配置PATH:电脑--属性--高级系统设置 ...

  7. linux查找文件或字符串的命令

    1. linux下面用于查到的命令有哪些? 是不是有很多呀,这个我还没做过统计和调查,不过这篇博客只介绍grep与find的最基本应用. grep和find功能都是相当的强大,这里也只是介绍这两个命令 ...

  8. .idata数据的解析

    每类Section代表不同的数据,不同的数据存储组织方式一定是有非常大区别的.代码段与资源段一定区别巨大,这意味着我需要一个一个的学习每个段的解析. idata段解析 这个段主要存储的是导入符号信息. ...

  9. web开发性能优化---用户体验篇

    怎样从技术角度怎样增强用户体验.都是非常多平台都在做的事情,依据个人实际经验碰到几种体验做下总结. 1.降低页面刷新白屏 适当使用ajax技术.改善刷新白屏现象. 2.信息提醒,邮件.站内信.短信在购 ...

  10. 经常使用Firefox插件大全

    Web开发者经常使用的火狐插件 1)FireShot:是一个截图工具,来源于截图软件Screenshot Studio的开发商,是一个Firefox扩展或者说是Firefox版的Screenshot ...