AspNet核心Web Api使用ApiControllerAttribute

Jac*_*row 2 c# asp.net-core asp.net-core-webapi

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

[ApiController]
public class TestController : ControllerBase
{
 //implementation
}
Run Code Online (Sandbox Code Playgroud)

我已经看到了一些webapi项目,其中省略了该属性的使用.这里的 Microsoft文档说:

指示类型和所有派生类型用于提供HTTP API响应.此属性的存在可用于根据控制器的目的来定位约定,过滤器和其他行为.

但是,我仍然不明白.有人可以通过现实生活中的例子来解释这个属性的目的是什么?

Kir*_*kin 7

这在文档:ApiController属性注释中得到了很好的解释,该属性解释了将[ApiController]属性添加到控制器会执行以下操作:

  1. 自动HTTP 400响应

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

  2. 绑定源参数推断

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

  3. 多部分/表单数据请求推断

    推断multipart/form-data标记为的参数的Content-Type [FromForm].

  4. 属性路由要求

    要求必须对所有操作进行属性路由.

您可以在源代码中看到这是如何实际完成的:

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);
}
Run Code Online (Sandbox Code Playgroud)

如果您对上述任何功能不感兴趣,可以省略该属性.也可以通过配置ApiBehaviorOptions类来抑制单个功能.