【问题标题】:AspNet core web Api usage of ApiControllerAttributeApiControllerAttribute 的 AspNet 核心 web Api 使用
【发布时间】:2019-05-03 22:03:15
【问题描述】:

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

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

我见过一些 webapi 项目省略了这个属性的使用。 微软文档here 说:

表示一个类型和所有派生类型都用于服务 HTTP API 回应。该属性的存在可用于定位 基于目的的约定、过滤器和其他行为 控制器。

但是,我还是不明白。 有人可以用现实生活中的例子来解释这个属性的目的是什么吗?

【问题讨论】:

  • 查看this 以获取真实示例和接受的答案以获取更多见解。
  • 总是检查documentation,它都有很好的记录。它只是为 WebApi 控制器添加了额外的约定,确保您必须使用更少的属性来描述它(FromBody 属性变为可选,模型验证自动发生等)

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


【解决方案1】:

这在文档中得到了很好的解释: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

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

  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 类来抑制个别功能。

【讨论】:

    猜你喜欢
    • 2017-02-10
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2020-07-07
    相关资源
    最近更新 更多