ASP.NET MVC原理
仅此一文让你明白ASP.NET MVC原理
ASP.NET MVC由以下两个核心组成部分构成:
- 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与Action名称;
- 一个名为MvcHandler的自定义HttpHandler,用来实现对Controller的激活和Action的执行;
!!阅读本文前请先弄明白asp.net执行的流程及httpmodule与httphandler的作用。
下面是进行路由转换时相关类的简化结构图:

整个ASP.NET MVC系统的路由信息全部存放在RoteTable这个类的静态变量Routes(为一个RouteDictionary类型)中,网站开始运行时,在Application_Start中对路由进行注册:
RouteTable.Routes.Add("default",
new Route{Url="{controller}/{action}"});
当一个URL请求到来时,被UrlRoutingModule拦截,拦截后执行流程如下:
- 封装当前http上下文,变为HttpContextWrapper对象。
- 根据当前的http上下文,从Routes中得到与当前请求URL相符合的RouteData对象。该对象存储有RouteHandler信息。
- 把RouteData与http上下文请求封装成一个RequestContext对象。
- 根据RequestContext对象,从RouteData的RouteHandler中获取IHttpHandler。
- 执行IHttpHandler,进行请求的真正处理。
执行时序图如下图所示:

UrlRoutingModule的代码如下:
HttpContextWrapper httpContext = new HttpContextWrapper(HttpContext.Current);
RouteData routeData = RouteTable.Routes.GetRouteData(httpContext);
RequestContext requestContext = new RequestContext{ data = routeData, context= httpContext};
IHttpHandler handler = routeData.RouteHandler.GetHttpHandler(requestContext);
httpContext.RemapHandler(handler);
经过上面最后一步,执行HttpHandle后,程序正式进入Controller激活里面,相关类关系如下图所示:

同URL路由一样,MVC初始化时,也需要注册控制器的一些信息,这里是要让框架知道默认的控制器工厂是什么,所以在Application_Start中:
ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory());
程序通过上面的URL路由转换后,进入HttpHandle中,经过以下步骤实现对Controller的激活:
- 从Requestcontext封装的RouteData中得到Controller名字。
- 通过ControllerBuilder得到当前默认的Controller工厂。
- 根据Controller的名字,创建控制器对象(在ControllerFactory初始化的时候,会扫描整个程序集中所有实现IController接口的控制器类型,所以当调用CreateController时,实际上是直接获取)。
- 最后执行控制器。执行的实质其实就是执行ActionInvoker.InvokeAction,即根据请求上下文执行相应的Action。

在自定义的MvcHandler中,代码如下:
string controllerName =this.Requestcontext.RouteData.Controller;
IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
//通过controllerName得到Control(如HomeController)
IController controller = controllerFactory.CreateController(this.RequestContext,controllerName);
controller.Execute(this.RequestContext);
一个典型的IActionInvoker接口实现ControllerActionInvoker的InvokeAction方法如下:

public void InvokeAction(ControllerContext controllerContext,
string actionName)
{
//找到Action方法
MethodInfo method = controllerContext.Controller.GetType().GetMethods()
.First(m=>string.Compare(actionName,m.Name,true)==); //获取Action参数,并进行Model绑定
List<object> parameters = new List<object>();
foreach(ParameterInfo parameter in method.GetParameters())
{
parameters.Add(this.ModelBinder.BindModel(controllerContext,
parameter.Name, parameter.ParameterType));
} //执行Action,并得到ActionResult
ActionResult actionResult = method.Invoke(controllerContext.Controller,
parameters.ToArray()) as ActionResult; //最终ActionResult用HttpResponse将数据传回客户进行显示
actionResult.ExecuteResult(controllerContext); }

最终形成一个Http Response传回到客户端!!
ASP.NET MVC原理的更多相关文章
- ASP.NET MVC 原理
我出了份卷子做面试题,其中之一就是要求说说ASP.NET MVC的原理.感觉太空泛了,谁能说得准呢? 但是,如果站在我这个面试官立场,面试题好多时并不要求有标准答案,可能也没有什么标准答案,主要是通过 ...
- 仅此一文让你明白ASP.NET MVC原理
ASP.NET MVC由以下两个核心组成部分构成: 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与Action名称: 一个名为MvcHandler ...
- 【转】仅此一文让你明白ASP.NET MVC原理
原文地址:http://www.cnblogs.com/DotCpp/p/3269043.html ASP.NET MVC由以下两个核心组成部分构成: 一个名为UrlRoutingModule的自定义 ...
- 简述ASP.NET MVC原理
1.为什么ASP.NET需要MVC? 因为随着网站的的数量级越来越大,原始的网站方式,这里指的是WebForm,在运行速度和维护性方面,以及代码量上面,越来越难以满足日益庞大的网站维护成本.代码的重构 ...
- 仅此一文让你明白ASP.NET MVC 之View的显示(仅此一文系列二)
题外话 一周之前写的<仅此一文让你明白ASP.NET MVC原理>受到了广大学习ASP.NET MVC同学的欢迎,于是下定决心准备把它写成一个系列,以满足更多求知若渴的同学们.蒋金楠老师已 ...
- ASP.NET MVC 之View
仅此一文让你明白ASP.NET MVC 之View的显示(仅此一文系列二) 题外话 一周之前写的<仅此一文让你明白ASP.NET MVC原理>受到了广大学习ASP.NET MVC同学的 ...
- Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门
一.MVC简单入门 1.1.MVC概念 视图(View) 代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML.XML和Applet. 模型(Model) 表示用户对其数 ...
- ASP.NET MVC学习目录
一.ASP.NET MVC原理详解 1.了解MVC架构模式 3.学习ASP.NET MVC的必备语言知识 4.MVC中的razor语法详解 5.ASP.NET MVC路由系统机制详细讲解 6.ASP. ...
- ASP.NET MVC 5 Web编程2 -- URL映射(路由原理)
本章将讲述ASP.NET MVC5 的路由原理,即URL映射机制. 简单点就是解释:为什么MVC在浏览器输入地址就能访问到类(或类中的方法)?这是怎么做到的?我自己可以通过.NET写出一个自己的MVC ...
随机推荐
- JS与APP原生控件交互
"热更新"."热部署"相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显 ...
- Web安全相关(五):SQL注入(SQL Injection)
简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...
- Extjs 让combobox写起来更简单
也已经写了很久时间的extjs ,每次都用到很多的combobox,配置很多东西觉得实在是太麻烦,所以根据常用到的情况写了一个简便的combobox,再次记录下来,以免放在某个地方忘记了找不到了. 定 ...
- KOTLIN开发语言文档(官方文档) -- 2.基本概念
网页链接:https://kotlinlang.org/docs/reference/basic-types.html 2. 基本概念 2.1. 基本类型 从可以在任何变量处理调用成员函数和属性 ...
- Android中BroadcastReceiver的两种注册方式(静态和动态)详解
今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...
- Vim使用
模式 ESC\Ctrl+c:退出编辑模式 ZZ\wq:命令模式下保存退出 编辑 i:进入编辑模式 I:转到行首非空字符开始编辑 s:删除当前字符进入编辑模式 a:从当前字符后开始编辑 A:从当前行末非 ...
- Pramp mock interview (4th practice): Matrix Spiral Print
March 16, 2016 Problem statement:Given a 2D array (matrix) named M, print all items of M in a spiral ...
- linux-linux top 命令各参数详解
简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按 ...
- 【已解决】Https请求——基础连接已经关闭 发送时发生错误
本人在做商用项目的推送消息功能时,借助第三方推送服务.这里避免有打广告的嫌疑,就不报名字了.由于是通过调用API接口,所以Post方法是自己写的,但是在开发环境是可以正常推送的,但是一上线就出各种问题 ...
- ASP.NET Web API 管道模型
ASP.NET Web API 管道模型 前言 ASP.NET Web API是一个独立的框架,也有着自己的一套消息处理管道,不管是在WebHost宿主环境还是在SelfHost宿主环境请求和响应都是 ...