ASP.NET MVC由以下两个核心组成部分构成:

  1. 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与Action名称;
  2. 一个名为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拦截,拦截后执行流程如下:

  1. 封装当前http上下文,变为HttpContextWrapper对象。
  2. 根据当前的http上下文,从Routes中得到与当前请求URL相符合的RouteData对象。该对象存储有RouteHandler信息。
  3. 把RouteData与http上下文请求封装成一个RequestContext对象。
  4. 根据RequestContext对象,从RouteData的RouteHandler中获取IHttpHandler。
  5. 执行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的激活:

  1. 从Requestcontext封装的RouteData中得到Controller名字。
  2. 通过ControllerBuilder得到当前默认的Controller工厂。
  3. 根据Controller的名字,创建控制器对象(在ControllerFactory初始化的时候,会扫描整个程序集中所有实现IController接口的控制器类型,所以当调用CreateController时,实际上是直接获取)。
  4. 最后执行控制器。执行的实质其实就是执行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)==0);//获取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,并得到ActionResultActionResult actionResult = method.Invoke(controllerContext.Controller,parameters.ToArray()) as ActionResult;//最终ActionResult用HttpResponse将数据传回客户进行显示actionResult.ExecuteResult(controllerContext);}

最终形成一个Http Response传回到客户端!!

以上即为我整理的ASP.NET MVC的两个核心流程,希望新手看的明白,老手多多指点其中的问题,谢谢!!有时间会继续放出MVC其它核心技术。如Model绑定、数据验证等,同时认真向Artech学习!!!!

文章来源:仅此一文让你明白ASP.NET MVC原理

转载于:https://www.cnblogs.com/qxoffice2008/p/4094107.html

仅此一文让你明白ASP.NET MVC原理相关推荐

  1. 通过一个模拟程序让你明白ASP.NET MVC是如何运行的

    ASP.NET MVC的路由系统通过对HTTP请求的解析得到表示Controller.Action和其他相关的数据,并以此为依据激活Controller对象,调用相应的Action方法,并将方法返回的 ...

  2. ASP.NET MVC 原理

    ASP.NET MVC由以下两个核心组成部分构成: 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与Action名称: 一个名为MvcHandler ...

  3. 仅此一文让你明白事务隔离级别、脏读、不可重复读、幻读

    网络上关于这方面的博文有些偏理论,有些通篇代码,都不能深入浅出.本文用图文并茂的方式,配上行云流水般的代码,非要摆清楚这个问题.相关代码已提交至码云(点击这里下载). 事务是现代关系型数据库的核心之一 ...

  4. ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

    在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie ...

  5. [翻译:ASP.NET MVC 教程]理解模型、视图和控制器

    本篇教程为你提供了ASP.NET MVC的模型.视图和控制器的高级概述.换句话说,即本文向你解释了在ASP.NET MVC中"M"."V"和"C&qu ...

  6. ASP.NET MVC 入门

    入门基础 ASP.NET MVC 是微软系列基于 C# 语言的 Web 开发框架,并不适合 0 基础入门,在学习之前你必须要了解 4 个知识点: 1.HTML 基础.网页的基本标签,结合 ASP.NE ...

  7. 王文京一把抓住ASP

    本文写于2000年. 据Dataquest估计,到2003年,全球ASP市场规模将达到227亿美元.ASP为Internet开启了继网上广告之后第二个最主要的赢利来源.Internet不再只是.com ...

  8. ASP.NET MVC视图引擎SPARK文档中文版

    一,前言 写个前言还是不错的,可以先让大家看看这个文章是个大体什么内容,然后打酱油的打酱油,路过的继续路过,但相信停下来总有些许收获. 很久没有写东西,一个最近挺忙,二个好像没有什么特别好的内容好写, ...

  9. 支付宝接口程序、文档及解读(ASP.NET)

    支付宝接口程序.文档及解读(ASP.NET) 最近需要为网站加入支付宝的充值接口,而目前关于支付宝接口开发的资料比较杂乱,这里就我此次开发所用到的资料进行汇总整理,希望能够帮助需要的朋友. 开发步骤: ...

最新文章

  1. photoshop修复面部的皱纹
  2. 模型可解释性技术概览
  3. sublime_text3代码自动提示补全
  4. IDEA没有MVC视图
  5. Natasha v2.5.4 版与运行时实战
  6. 95-10-025-启动-BrokerId相关
  7. MFC下运行控制台不显示黑屏
  8. java8foreach_Java forEach – Java 8 forEach
  9. mysql post 注入工具类_【Mysql sql inject】POST方法BASE64编码注入write-up
  10. python基于高德地图坐标拾取系统获取地址坐标
  11. 烽火HG680-KB及其他5款Hi3798MV310芯片盒子刷机固件及教程(当贝桌面)
  12. Ubuntu上aplay不能播放MP3, 使用sox
  13. 支付宝小程序会员卡开通
  14. php助理面试技巧,助理类面试问题
  15. 迪杰特斯拉算法Python版本
  16. Linux网卡模块,裁剪Linux并实现网卡模块的安装(附有命令移植的脚本)
  17. 随机生成20个手机号码
  18. 计算机专业:考研 VS 工作
  19. 如何用Python画一只肥肥的柯基狗狗——turtle库绘制椭圆与弧线实践
  20. 追爱系列电影电视剧书籍

热门文章

  1. 自己的HTML5 播放器
  2. silverlight体验之三:简单控件堆成个Login
  3. 冈萨雷斯图像处理Matlab函数汇总
  4. ROS☞rosbag/rostopic消息记录、回放、转.txt
  5. java project mybatis,Java使用Mybatis
  6. java点击按钮发出声音_响应触发按钮声音onKeyPress问题
  7. 移动网络安全_中国移动研究院威胁情报区块链应用获区块链技术网络安全应用创新大赛全国一等奖...
  8. 中怎么提取时间中的月份_怎么提取图片中的文字?花上1分钟学会,轻松提取,按时下班...
  9. python函数参数为列表_python函数中把列表(list)当参数时的入坑与出坑
  10. ccf 路径解析 java_CCF 201604-3 路径解析