当我在API项目中创建新的控制器时,它将生成具有[ApiController]
属性的控制器类,如下所示:
[ApiController]
public class TestController : ControllerBase
{
//implementation
}
我见过一些webapi项目,其中省略了此属性的使用。 Microsoft文档here说:
指示使用一种类型和所有派生类型来提供HTTP API 回应。此属性的存在可用于定位 约定,过滤器和其他基于行为目的的行为 控制器。
但是,我还是不明白。 有人可以通过实际示例来解释此属性的目的吗?
答案 0 :(得分:6)
这在文档Annotation with ApiController attribute中有很好的解释,它说明了将[ApiController]
属性添加到控制器可以实现以下目的:
添加一个动作过滤器,如果ModelState.IsValid
为false
,则返回400响应。
Binding source parameter inference
更改模型绑定约定。例如,对于复杂类型的参数,推断出[FromBody]
。
Multipart/form-data request inference
推断标记为multipart/form-data
的参数的内容类型为[FromForm]
。
强制所有动作必须进行属性路由。
您可以在source中查看实际的操作方式:
foreach (var actionModel in controllerModel.Actions)
{
if (!isApiController && !actionModel.Attributes.OfType<IApiBehaviorMetadata>().Any())
{
continue;
}
EnsureActionIsAttributeRouted(controllerHasSelectorModel, actionModel);
AddInvalidModelStateFilter(actionModel);
InferParameterBindingSources(actionModel);
InferParameterModelPrefixes(actionModel);
AddMultipartFormDataConsumesAttribute(actionModel);
}
如果您对上述任何功能均不感兴趣,则可以忽略该属性。通过配置ApiBehaviorOptions
类,也可以隐藏单个功能。