我们知道在MVC5和之前的版本,两个框架的生命周期是不一样的,在新版MVC6中,MVC Controller/Web API Controller已经合二为一了,本章我们主要讲解Controller和Action的定义与使用,以及在MVC框架中,如何根据路由查询相应的Controller和Action。
Controller&Action的定义和使用
在新版MVC6框架中,依然提供了一个Controller基类,在这里除了依然提供了Url、RouteData、HttpContext、Request、Response以外,还提供了一个IServiceProvider类型的Resovler属性,该属于是依赖注入的容器,用于获取当前请求作用域内指定类型的实例对象。
其遵守如下规则:
继承于Microsoft.AspNet.Mvc.Controller的类肯定都是控制器,不管有没有Controller后缀。不继承Microsoft.AspNet.Mvc.Controller的自定义XXXController要作为MVC Controller的话,,则必须要引用Microsoft.AspNet.Mvc相关的程序集。如果不想让满足上述条件的Controller类作为Controller,需要在该类上加上NonControllerAttribute特性。同理,如果不想让某个Controller中的方法作为Action,则需要在该方法上加上NonActionAttribute特性。
另外还有如下几个特性需要注意:
| 特性 | 描述 |
|---|---|
| ActionNameAttribute | 定义Action的名称(可以和Action方法名不同) |
| AcceptVerbsAttribute | 定义支持的Http Method名称,支持单个或多个Method。 |
| ActivateAttribute | 依赖注入的标记,可以放在具有set权限的属性或字段上。 |
| ResponseCacheAttribute | 针对某个Controller或Action设置客户端缓存。 |
| RequireHttpsAttribute | 限制必须是Https请求。 |
| RemoteAttribute | 标记为Ajax请求,服务器端不验证form表单的验证。 |
| NonControllerAttribute | 标记该类不是Controller。 |
| NonActionAttribute | 标记该方法不是Action。 |
Controller的查找机制
由上述章节,我们知道MVC6不仅支持正常的Controller(继承于Controller基类的子类),也支持POCO的Controller,本节我们就来研究一下Controller的查找原理机制。
首先,要判断一个类是否是Controller必须先确定有多少个程序集里定义了这样的类。Microsoft.AspNet.Mvc命名空间下的IAssemblyProvider接口就是覆盖查找所有可能定义Controller的程序集,该接口的默认实现是DefaultAssemblyProvider








