MVC5-9 今天讲三个Descriptor
2016-11-02 21:53
127 查看
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
我在上面加了一些特性。下面开始进行调试验证
![](https://images2015.cnblogs.com/blog/832799/201611/832799-20161102215258861-1124388414.png)
印证了上面的流程,现在激活了Controller开始进入BeginExecuteCore,下面我们进行这个方法里看看
![](https://images2015.cnblogs.com/blog/832799/201611/832799-20161102215302877-1576047527.png)
现在已经进入了BeginExecuteCore,在这里要执行AsyncControllerActionInvoker的BeginInvokeAction方法,一切都和上面的流程一样,现在我们进入这个方法再去看一看
![](https://images2015.cnblogs.com/blog/832799/201611/832799-20161102215306471-2007448282.png)
现在已经看到了ControllerDescriptor和ActionDescriptor
![](https://images2015.cnblogs.com/blog/832799/201611/832799-20161102215309643-1345999832.png)
在不停的F11后会进入一个IsValidMethodSelector方法,在这里就是对action的attribute的方法了,方法里循环遍历了特性集合进行循环验证,
![](https://images2015.cnblogs.com/blog/832799/201611/832799-20161102215311893-1942449728.png)
如果验证失败会是什么情况? 会返回一个ActionNotFound请看下面两张图
![](https://images2015.cnblogs.com/blog/832799/201611/832799-20161102215312971-1117450006.png)
![](https://images2015.cnblogs.com/blog/832799/201611/832799-20161102215313830-1733825785.png)
上面的验证过了后会继续进行pramater的验证与绑定,这个方法就是了。
![](https://images2015.cnblogs.com/blog/832799/201611/832799-20161102215315190-1838712581.png)
最后就结束了,可能真的很乱,希望大家在看博文的同时可以进行调试对比,在最后的几个验证最好是逐语句,同时多看看调用堆栈。最后其实要说其实有一些走的都是异步版本的Descriptor,比如 ReflectedAsyncControllerDescriptor
相关文章推荐
- 应用在今天一天先后上线腾讯的三个平台,高兴。
- 今天的三个新闻
- ASP.NET MVC三个重要的描述对象四:ParameterDescriptor
- 今天公司的三个域名全部遭劫持 -- 经理让重新申请 -- 想域名中 ...
- 今天的第一个程序-南阳acm输入三个数排序
- 今天太衰了,三个错误,折磨了一天
- ASP.NET MVC三个重要的描述对象:ParameterDescriptor
- 从今天2006-6-6开始给自己定个计划:每天三个技巧,三篇文章
- 今天上班碰见的三个问题 希望又能能给我解答一下 QQ576241020
- 今天遇到的三个问题
- 今天从系统中找出的三个BUG
- 今天在CSDN安家了
- 贴一个项目中用到的.net显示今天农历的代码!
- Date、String、Calendar三个类型之间的转化
- 今天体育课受伤
- 今天决定开始写blog了
- 从一个故障说说Java的三个BlockingQueue
- 初始面向对象(三个例子)