ASP.NET MVC源码分析
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源码分析的更多相关文章
- asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证
原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...
- asp.net mvc源码分析-ModelValidatorProviders 客户端的验证
几年写过asp.net mvc源码分析-ModelValidatorProviders 当时主要是考虑mvc的流程对,客户端的验证也只是简单的提及了一下,现在我们来仔细看一下客户端的验证. 如图所示, ...
- ASP.NET MVC 源码分析(一)
ASP.NET MVC 源码分析(一) 直接上图: 我们先来看Core的设计: 从项目结构来看,asp.net.mvc.core有以下目录: ActionConstraints:action限制相关 ...
- asp.net MVC 源码分析
先上一张图吧 asp.net请求机制的图 by传智播客邹华栋老师 然后是 邹老师添加MVC请求过程的图 其实MVC 是在.netframework上加了一个过滤器 HttpModule 在C:\W ...
- asp.net mvc源码分析-Route的GetRouteData
我知道Route这里东西应该算路由,这里把它放到mvc里面有些不怎么合适,但是我想大家多数遇到路由都是在mvc的时候吧.首先我们还是来看看GetRouteData方法吧 [csharp] public ...
- asp.net mvc源码分析-Action篇 IModelBinder
我们首先还是看看ReflectedParameterBindingInfo的Binder属性吧: public override IModelBinder Binder { ge ...
- ASP.NET MVC源码分析系列
Controller下的JsonResult的ExecuteResult方法 public override void ExecuteResult(ControllerContext context) ...
- ASP.NET MVC 源码分析(二) —— 从 IRouteBuilder认识路由构建
我们来看IRouteBuilder的定义: public interface IRouteBuilder { IRouter DefaultHandler { get; set; } IService ...
- ASP.NET WebForm / MVC 源码分析
浏览器 Url:https//localhost:6565/Home/Index ,https//localhost:6565/WebForm1.aspx,请求服务器(构建请求报文,并且将请求报文发送 ...
随机推荐
- ExtJs4 笔记(8) Ext.slider 滚轴控件、 Ext.ProgressBar 进度条控件、 Ext.Editor 编辑控件
本篇要登场的有三个控件,分别是滚轴控件.进度条控件和编辑控件. 一.滚轴控件 Ext.slider 1.滚轴控件的定义 下面我们定义三个具有代表意义滚轴控件,分别展示滚轴横向.纵向,以及单值.多值选择 ...
- Mysql自增主键ID重新排序方法详解
Mysql数据库表的自增主键ID号乱了,需要重新排列. 原理:删除原有的自增ID,重新建立新的自增ID. 1,删除原有主键: ALTER TABLE `table_name` DROP `id`; 2 ...
- 怎样用Java编写一段代码引发内存泄露
通过下面步骤能够非常easy产生内存泄露(程序代码不能訪问到某些对象,可是它们仍然保存在内存中): 应用程序创建一个长时间执行的线程(或者使用线程池,会更快地发生内存泄露). 线程通过某个类载入器(能 ...
- 在Ubuntu上录制视频和编辑(很全)
Linux多媒体三剑客:GIMP,Inkscape,Blender3D Blender基金会制作的开源微电影Sintel:http://www.sintel.org/about电影采用Creative ...
- RBAC用户角色权限设计方案
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用 户-角色 ...
- Python -- 堆数据结构 heapq - I love this game! - 博客频道 - CSDN.NET
Python -- 堆数据结构 heapq - I love this game! - 博客频道 - CSDN.NET Python -- 堆数据结构 heapq 分类: Python 2012-09 ...
- 动态拼接lambda表达式树
前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dapperLambda按条件查询时是传入表 ...
- storm-编程入门
一 编程接口 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbm ...
- C# 文件操作(全部) 追加、拷贝、删除、移动文件、创建目录 修改文件名、文件夹名
原文:C# 文件操作(全部) 追加.拷贝.删除.移动文件.创建目录 修改文件名.文件夹名 本文也收集了目前最为常用的C#经典操作文件的方法,具体内容如下:C#追加.拷贝.删除.移动文件.创建目录.递归 ...
- Beijing Perl Workshop - Augest 10th, 2013
Beijing Perl Workshop - Augest 10th, 2013 Beijing Perl Workshop