ASP.NET Core Web API 开发指南
概述
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. 多部分/表单数据推断
对于 IFormFile 和 IFormFileCollection 类型参数,自动推断 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
});
最佳实践
- 保持控制器精简:将业务逻辑放在服务层
- 使用适当的HTTP状态码:准确反映操作结果
- 实现一致的错误处理:使用ProblemDetails提供标准错误响应
- 考虑API版本控制:从项目开始就规划版本策略
- 实现适当的缓存策略:使用ETag或Cache-Control头部
总结
ASP.NET Core 提供了强大而灵活的工具来构建 Web API。通过合理使用控制器、ApiController 特性和各种配置选项,开发者可以创建高效、可维护且符合标准的 RESTful 服务。理解这些核心概念是构建高质量 API 的基础。
