[ApiController]属性是什么作用?

26

我注意到使用或不使用这个属性效果是相同的。我错了吗?

举个例子:

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

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

在Microsoft文档中,我找到了以下解释:

指示类型及其所有派生类型用于提供HTTP API响应。
使用此属性装饰的控制器被配置为具有针对改善构建API的开发人员体验的特征和行为。
当在程序集上使用时,程序集中的所有控制器都将被视为具有API行为的控制器。

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

1个回答

41
[ApiController] 属性可启用几个功能,包括属性路由要求、自动模型验证和绑定源参数推断。这是从微软文档Create web APIs with ASP.NET Core中直接摘取的: "可以将 [ApiController] 属性应用于控制器类,以启用以下基于 API 的行为:" 属性路由要求、自动 HTTP 400 响应、绑定源参数推断、多部分/表单数据请求推断和错误状态代码的问题详细信息。问题详细信息特性需要兼容版本为2.2或更高版本。其他功能需要兼容版本为2.1或更高版本。 Attribute routing 将在使用 [ApiController] 时要求,例如:
[ApiController]
[Route("[controller]")]
public class DataTablesController: ControllerBase

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

自动 Http 400 响应

添加一个操作筛选器以返回 400 响应如果 ModelState 验证失败。您不再需要在操作中编写此代码,它将自动处理:

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

绑定源参数推断

再次引用链接文档中的描述:

绑定源属性定义了操作参数值的位置。以下是可用的绑定源属性:[FromBody][FromForm][FromHeader][FromQuery][FromRoute][FromServices]

多部件/form-data请求推断

[ApiController] 属性在使用 [FromForm] 属性注释操作参数时应用一个推断规则,可以推断出 multipart/form-data 请求的内容类型。

以下是使用绑定源参数推断的示例:

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

2
如果有人对源代码感兴趣,可以在 ApiBehaviorApplicationModelProvider源代码)中找到它执行的具体约定,并且可以通过 ApiBehaviorOptions源代码)进行自定义行为,该选项模式可通过容器访问。 - Leaky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接