首页
/ ASP.NET Core Web API 开发指南

ASP.NET Core Web API 开发指南

2025-07-06 04:08:30作者:范垣楠Rhoda

概述

ASP.NET Core 提供了强大的功能来构建 Web API,支持通过控制器或最小 API 两种方式创建。本文将重点介绍基于控制器的 Web API 开发方法,这是构建 RESTful 服务的传统且功能完备的方式。

控制器基础

ControllerBase 类

Web API 控制器应继承自 ControllerBase 类,而不是用于 MVC 视图的 Controller 类。ControllerBase 提供了丰富的属性和方法来处理 HTTP 请求:

public class ProductsController : ControllerBase
{
    // 控制器方法
}

ControllerBase 包含许多有用的方法,例如:

  • Ok() - 返回 200 状态码
  • CreatedAtAction() - 返回 201 状态码
  • BadRequest() - 返回 400 状态码
  • NotFound() - 返回 404 状态码

常用属性

ASP.NET Core 提供了多种属性来配置控制器和行为:

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    [HttpGet("{id}")]
    public ActionResult<Product> GetById(int id)
    {
        // ...
    }
}

常用属性包括:

  • [Route] - 指定控制器或操作的 URL 模式
  • [HttpGet], [HttpPost] 等 - 指定支持的 HTTP 方法
  • [Produces] - 指定返回的数据类型
  • [Consumes] - 指定接受的数据类型

ApiController 特性

[ApiController] 特性为控制器启用了多个 API 专用行为:

1. 属性路由要求

使用 [ApiController] 的控制器必须使用属性路由,不能使用传统路由。

2. 自动 HTTP 400 响应

当模型验证失败时,自动返回 HTTP 400 响应,无需手动检查 ModelState.IsValid

3. 绑定源推断

自动推断参数绑定源:

  • 复杂类型参数默认从请求体绑定 ([FromBody])
  • 简单类型参数默认从查询字符串绑定 ([FromQuery])
  • 与路由模板匹配的参数从路由数据绑定 ([FromRoute])

4. 多部分/表单数据推断

对于 IFormFileIFormFileCollection 类型参数,自动推断 multipart/form-data 内容类型。

5. 错误状态码的问题详情

对于 400 及以上状态码,自动转换为 ProblemDetails 响应,符合 RFC 7807 规范。

参数绑定

ASP.NET Core 提供了多种绑定源属性:

属性 绑定源
[FromBody] 请求体
[FromForm] 表单数据
[FromHeader] 请求头
[FromQuery] 查询字符串
[FromRoute] 路由数据
[FromServices] 依赖注入服务

示例:

public IActionResult Get(
    [FromQuery] int page, 
    [FromRoute] int id,
    [FromServices] IProductRepository repository)
{
    // ...
}

高级配置

自定义自动 400 响应

可以通过配置 InvalidModelStateResponseFactory 来自定义自动 400 响应:

builder.Services.Configure<ApiBehaviorOptions>(options =>
{
    options.InvalidModelStateResponseFactory = context =>
    {
        var logger = context.HttpContext.RequestServices
            .GetRequiredService<ILogger<Program>>();
        
        // 记录验证错误
        logger.LogWarning("模型验证失败: {Errors}", context.ModelState);
        
        return new BadRequestObjectResult(context.ModelState);
    };
});

禁用特定 ApiController 行为

可以禁用任何默认行为:

builder.Services.Configure<ApiBehaviorOptions>(options =>
{
    options.SuppressModelStateInvalidFilter = true; // 禁用自动400响应
    options.SuppressInferBindingSourcesForParameters = true; // 禁用绑定源推断
    options.SuppressMapClientErrors = true; // 禁用ProblemDetails
});

最佳实践

  1. 保持控制器精简:将业务逻辑放在服务层
  2. 使用适当的HTTP状态码:准确反映操作结果
  3. 实现一致的错误处理:使用ProblemDetails提供标准错误响应
  4. 考虑API版本控制:从项目开始就规划版本策略
  5. 实现适当的缓存策略:使用ETag或Cache-Control头部

总结

ASP.NET Core 提供了强大而灵活的工具来构建 Web API。通过合理使用控制器、ApiController 特性和各种配置选项,开发者可以创建高效、可维护且符合标准的 RESTful 服务。理解这些核心概念是构建高质量 API 的基础。