【问题标题】:What does the [ApiController] attribute do? [duplicate][ApiController] 属性有什么作用? [复制]
【发布时间】:2021-06-07 06:43:37
【问题描述】:

我注意到无论是否使用此属性都是一样的。我错了吗?

举个例子:

[Route("[controller]")]
[ApiController]
public class DataTablesController: ControllerBase
{
    [HttpGet]
    public IActionResult Test()
    {
        return Ok("test");
    }
}

当我删除 [ApiController] 属性时没有发生任何事情。

在微软文档中,我找到了这样的解释:

表示一个类型和所有派生类型都用于提供 HTTP API 响应。
使用此属性修饰的控制器配置了旨在改善开发人员构建 API 体验的功能和行为。
当在程序集上进行装饰时,程序集中的所有控制器都将被视为具有 API 行为的控制器。

什么是 API 行为?我们为什么要使用它?

【问题讨论】:

    标签: c# asp.net-core controller asp.net-apicontroller .net-attributes


    【解决方案1】:

    [ApiController] 属性启用了一些功能,包括属性路由要求、自动模型验证和绑定源参数推断。

    这直接取自 MS 文档 Create web APIs with ASP.NET Core

    [ApiController] 属性可以应用于控制器类以 启用以下自以为是的、特定于 API 的行为:

    • 属性路由要求
    • 自动 HTTP 400 响应
    • 绑定源参数推断
    • 多部分/表单数据请求推断
    • 错误状态代码的问题详细信息

    错误的问题详细信息 状态码功能需要 2.2 或更高版本的兼容版本。 其他功能需要 2.1 或更高版本的兼容版本。

    以下功能的一些细节:

    属性路由

    如果使用[ApiController],则需要属性路由,例如:

    [ApiController]
    [Route("[controller]")]
    public class DataTablesController: ControllerBase
    

    无法通过 Startup.Configure 中的 UseEndpoints、UseMvc 或 UseMvcWithDefaultRoute 定义的常规路由访问操作

    自动 Http 400 响应

    如果ModelState 验证失败,则添加一个操作过滤器以返回 400 响应。您不再需要在您的操作中编写此内容,它将自动处理:

    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    

    绑定源参数推断

    同样,来自链接的文档:

    绑定源属性定义动作的位置 找到参数的值。以下绑定源属性 存在:[FromBody][FromForm][FromHeader][FromQuery][FromRoute][FromServices]

    Multipart/form-data 请求推断

    [ApiController] 属性在操作时应用推理规则 参数使用 [FromForm] 属性进行注释。这 推断出 multipart/form-data 请求的内容类型。

    一个使用绑定源参数推断的例子:

    [HttpPost]
    public IActionResult Test([FromForm] Model model)
    {
        return Ok("test");
    }
    

    【讨论】:

    • 如果有人对源代码感兴趣,它执行的具体约定可以在ApiBehaviorApplicationModelProvider (source) 中找到,并且可以通过ApiBehaviorOptions (source) 自定义行为,其中可以通过选项模式从容器中访问。
    猜你喜欢
    • 2011-08-31
    • 2012-12-22
    • 2013-02-28
    • 2021-09-12
    • 2017-04-22
    • 2018-04-28
    • 2011-06-01
    • 1970-01-01
    • 2017-01-13
    相关资源
    最近更新 更多