AspNet核心Web Api对ApiControllerAttribute的使用

时间:2018-12-02 11:22:59

标签: c# asp.net-core asp.net-core-webapi

当我在API项目中创建新的控制器时,它将生成具有[ApiController]属性的控制器类,如下所示:

[ApiController]
public class TestController : ControllerBase
{
 //implementation
}

我见过一些webapi项目,其中省略了此属性的使用。 Microsoft文档here说:

  

指示使用一种类型和所有派生类型来提供HTTP API   回应。此属性的存在可用于定位   约定,过滤器和其他基于行为目的的行为   控制器。

但是,我还是不明白。 有人可以通过实际示例来解释此属性的目的吗?

1 个答案:

答案 0 :(得分:6)

这在文档Annotation with ApiController attribute中有很好的解释,它说明了将[ApiController]属性添加到控制器可以实现以下目的:

  1. Automatic HTTP 400 responses

    添加一个动作过滤器,如果ModelState.IsValidfalse,则返回400响应。

  2. Binding source parameter inference

    更改模型绑定约定。例如,对于复杂类型的参数,推断出[FromBody]

  3. Multipart/form-data request inference

    推断标记为multipart/form-data的参数的内容类型为[FromForm]

  4. Attribute routing requirement

    强制所有动作必须进行属性路由。

您可以在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类,也可以隐藏单个功能。