博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC5-9 今天讲三个Descriptor
阅读量:6152 次
发布时间:2019-06-21

本文共 1261 字,大约阅读时间需要 4 分钟。

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

转载于:https://www.cnblogs.com/LiangSW/p/6024671.html

你可能感兴趣的文章
虚机不能启动的特例思考
查看>>
SQL Server编程系列(1):SMO介绍
查看>>
在VMware网络测试“专用VLAN”功能
查看>>
使用Formik轻松开发更高质量的React表单(三)<Formik />解析
查看>>
也问腾讯:你把用户放在什么位置?
查看>>
CSS Sprites 样式生成工具(bg2css)
查看>>
[转]如何重构代码--重构计划
查看>>
类中如何对list泛型做访问器??
查看>>
C++解析XML--使用CMarkup类解析XML
查看>>
P2P应用层组播
查看>>
Sharepoint学习笔记—修改SharePoint的Timeouts (Execution Timeout)
查看>>
CSS引入的方式有哪些? link和@import的区别?
查看>>
Redis 介绍2——常见基本类型
查看>>
asp.net开发mysql注意事项
查看>>
(转)Cortex-M3 (NXP LPC1788)之EEPROM存储器
查看>>
ubuntu set defult jdk
查看>>
[译]ECMAScript.next:TC39 2012年9月会议总结
查看>>
【Xcode】编辑与调试
查看>>
用tar和split将文件分包压缩
查看>>
[BTS] Could not find stored procedure 'mp_sap_check_tid'
查看>>