ControllerDescriptor、ActionDescriptor、ParmaterDescriptor

看名字一脸懵逼,这是做什么的呢?可别小看它们,它们在MVC中扮演着尤为重要的角色。

思考 ,我们在MVC中可以用各种好用的预定义特性(attribute)来实现很棒的功能,例如HttpPost、HttpGet这样的特性,但是基础好的同学一定明白attribute本身不会做什么,而是我们在背后对它做了什么。背后的故事,就在这三个类里了

其实说是这三个类也不太准确,因为它们都是抽象类,而实现它们的则是真正故事中的主角 ReflectedActionDescriptor、ReflectedControllerDescriptor、ReflectedParmaterDescriptor

深入浅出

我们需要做一些准备工作,因为后面内容可能会有点的绕,但是我们掌握住管道流的核心,就没有问题了。

一个请求被IIS转发到应用程序 ,后面会经历这样一个流程。可以看到激活Controller后会执行BeginExecuteCore方法,而在这个方法里会调用BeginInvokeAction就会进行检查我们的特性。

UrlrouringModel—>MvcHandler—>ControllerFactory(Controller)—>ActionInvoke(BeginInvokeAction)—>Controller[FindAction]检查特性 || Action 检查特性 || Parmater 检查特性 –> ActionInvoke 执行action

我在上面加了一些特性。下面开始进行调试验证

印证了上面的流程,现在激活了Controller开始进入BeginExecuteCore,下面我们进行这个方法里看看

现在已经进入了BeginExecuteCore,在这里要执行AsyncControllerActionInvoker的BeginInvokeAction方法,一切都和上面的流程一样,现在我们进入这个方法再去看一看

现在已经看到了ControllerDescriptor和ActionDescriptor

在不停的F11后会进入一个IsValidMethodSelector方法,在这里就是对action的attribute的方法了,方法里循环遍历了特性集合进行循环验证,

如果验证失败会是什么情况? 会返回一个ActionNotFound请看下面两张图

上面的验证过了后会继续进行pramater的验证与绑定,这个方法就是了。

最后就结束了,可能真的很乱,希望大家在看博文的同时可以进行调试对比,在最后的几个验证最好是逐语句,同时多看看调用堆栈。最后其实要说其实有一些走的都是异步版本的Descriptor,比如 ReflectedAsyncControllerDescriptor

MVC5-9 今天讲三个Descriptor的更多相关文章

  1. MVC5控制器传值的三种方式(ViewData,ViewBag,TempData),刚刚学习MVC5的新手,希望各位大神多多指教

    mvc传值的三种方式:1.ViewData 在使用过程中需要类型转换 例子: ViewData["MyTitle"]="ViewData传值"; 引用: @Vi ...

  2. asp.net mvc5 step by step(三)—— Entity Framework Database First

    一.先建数据库. 打开,SQL Server Management 新建数据库Employee 并新建表 /****** Object: Table [dbo].[t_Employee] Script ...

  3. mybatis精讲(三)--标签及TypeHandler使用

    目录 话引 XML配置标签 概览 properties 子标签property resource 程序注入 settings 别名 TypeHandler 自定义TypeHandler EnumTyp ...

  4. ASP.NET + MVC5 入门完整教程三 (下) ---MVC 松耦合

    建立松耦合组件 MVC 模式最重要的特性之一视他支持关注分离,希望应用程序中的组件尽可能独立,只有很少的几个可控依赖项.在理想的情况下,每个组件都不了解其他组件,而只是通过抽象接口来处理应用程序的其他 ...

  5. vector详讲(三)实例

    移动语义: push语句有时候会通过移动语义来提高性能 #include <iostream> #include <vector> class Element { public ...

  6. 视觉SLAM十四讲(三)——三维空间刚体运动(下)

    理论部分请看 :三维空间刚体运动 一.Eigen的使用 首先安装 Eigen: sudo apt-get install libeigen3-dev 一般都安装在 /usr/include/eigen ...

  7. ASP.NET + MVC5 入门完整教程三 (上) ---第一个MVC项目

    https://blog.csdn.net/qq_21419015/article/details/80420815 第一个MVC应用程序 1创建MVC项目 打开VS ,File--新建--项目,选择 ...

  8. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  9. 三天讲透SpringBoot-初识基础使用

    这次我们来说一下我们的SpringBoot,现在SpringBoot已经成为趋势,在我这里我用三篇文章的形式来讲清楚我们的SpringBoot,大致分为,第一篇讲搭建,基本使用,第二篇三方集成,自动装 ...

随机推荐

  1. scala 学习笔记(02) 元组Tuple、数组Array、Map、文件读写、网页抓取示例

    package yjmyzz import java.io.PrintWriter import java.util.Date import scala.io.Source object ScalaA ...

  2. mybatis 3.x 缓存Cache的使用

    mybatis 3.x 已经支持cache功能了,使用很简单,在mappper的xml文件里添加以下节点: <mapper namespace="com.cnblogs.yjmyzz. ...

  3. .Net分布式异常报警系统-服务端Service

    服务端的2个Service 1. HandleService: 从Redis中获取异常信息, 入库并发送通知到相关责任人.  2. HealthyCheckService: 对站点指定页面进行模拟访问 ...

  4. RHEL每天定时备份Oracle

    步骤: (1)创建脚本文件bak_112.sh,内容如下(自动按当前日期备份数据库): #!/bin/sh export ORACLE_BASE=/u01/app/oracle; ORACLE_HOM ...

  5. Xamarin Android -创建Splash Screen (一)

    ......(空话少说) Xamarin 开发的技术资料很少,通过学习,把自己的学习过程及其中碰到的问题与大家分享. Splash Screen 就是在应用程序启动时,出现的一张图片,一般App的Sp ...

  6. JPA和hibernate的关系

    实际上,JPA的标准的定制是hibernate作者参与定制的,所以JPA是hibernate的一个总成,可以这么理解

  7. 别名现象,java对象之间的相互赋值

    请看一下代码 import java.util.*; class book{ static  int c = null; } public static void main(String[] args ...

  8. PotPlayer为播放而生的专业播放器

    韩国,比较牛逼的视频播放器.专注与本地视频播放,值得拥有.... 免费下载:http://yunpan.cn/cmZ5ELC6DTI8Y  访问密码 4bf1

  9. android Baseadapter 和 ViewHolder的使用

    昨晚学习了徐大神的关于BaseAdapter的讲解,让我受益匪浅特来博客留下印记 说到baseadapter大家一定都不陌生,下面这张图就展示了数据.listview.baseadapter 之间的关 ...

  10. 1014mysqldumpslow.pl简单分析慢日志 WINDOW平台

    转自http://www.th7.cn/db/mysql/201507/113998.shtml 要想运行mysqldumpslow.pl(这是perl程序),下载perl编译器.下载地址:http: ...