在 ASP.NET Core WebAPI如何实现版本控制?

ASP.NET Core WebAPI 中实现版本控制(Versioning)是一种常见的做法,用于管理 API 的演进和兼容性。通过版本控制,我们可以在不破坏现有客户端的情况下引入新功能或修改现有功能。以下是实现版本控制的几种常见方法:


1. 使用 URL 路径版本控制

将版本号嵌入到 URL 路径中,例如 /api/v1/controller/api/v2/controller

实现步骤

安装 Microsoft.AspNetCore.Mvc.Versioning 包:

复制代码
dotnet add package Microsoft.AspNetCore.Mvc.Versioning

Program.cs 中配置版本控制:

复制代码
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
builder.Services.AddApiVersioning(options =>
{
    options.DefaultApiVersion = new ApiVersion(1, 0);
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.ReportApiVersions = true;
});

var app = builder.Build();
app.MapControllers();
app.Run();

在控制器中指定版本:

复制代码
[ApiController]
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
public class UsersController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok("Version 1.0");
    }
}

[ApiController]
[ApiVersion("2.0")]
[Route("api/v{version:apiVersion}/[controller]")]
public class UsersV2Controller : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok("Version 2.0");
    }
}

测试:

  • /api/v1/users 返回 Version 1.0
  • /api/v2/users 返回 Version 2.0

2. 使用查询字符串版本控制

将版本号作为查询参数传递,例如 /api/users?api-version=1.0

实现步骤

Program.cs 中配置版本控制:

复制代码
builder.Services.AddApiVersioning(options =>
{
    options.DefaultApiVersion = new ApiVersion(1, 0);
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.ReportApiVersions = true;
    options.ApiVersionReader = new QueryStringApiVersionReader("api-version");
});

在控制器中指定版本(与 URL 路径版本控制相同)。

测试:

  • /api/users?api-version=1.0 返回 Version 1.0
  • /api/users?api-version=2.0 返回 Version 2.0

3. 使用请求头版本控制

将版本号放在 HTTP 请求头中,例如 api-version: 1.0

实现步骤

Program.cs 中配置版本控制:

复制代码
builder.Services.AddApiVersioning(options =>
{
    options.DefaultApiVersion = new ApiVersion(1, 0);
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.ReportApiVersions = true;
    options.ApiVersionReader = new HeaderApiVersionReader("api-version");
});

在控制器中指定版本(与 URL 路径版本控制相同)。

测试:

  • 请求头中添加 api-version: 1.0,返回 Version 1.0
  • 请求头中添加 api-version: 2.0,返回 Version 2.0

4. 使用媒体类型版本控制

将版本号嵌入到 Accept 请求头中,例如 application/json;v=1.0

实现步骤

Program.cs 中配置版本控制:

复制代码
builder.Services.AddApiVersioning(options =>
{
    options.DefaultApiVersion = new ApiVersion(1, 0);
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.ReportApiVersions = true;
    options.ApiVersionReader = new MediaTypeApiVersionReader("v");
});

在控制器中指定版本(与 URL 路径版本控制相同)。

测试:

  • 请求头中添加 Accept: application/json;v=1.0,返回 Version 1.0
  • 请求头中添加 Accept: application/json;v=2.0,返回 Version 2.0

5. 组合多种版本控制方式

你可以同时支持多种版本控制方式,例如 URL 路径和查询字符串。

实现步骤

Program.cs 中配置版本控制:

复制代码
builder.Services.AddApiVersioning(options =>
{
    options.DefaultApiVersion = new ApiVersion(1, 0);
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.ReportApiVersions = true;
    options.ApiVersionReader = ApiVersionReader.Combine(
     new QueryStringApiVersionReader("api-version"),
     new HeaderApiVersionReader("api-version")
  );
});

在控制器中指定版本(与 URL 路径版本控制相同)。

测试:

  • /api/v1/users 返回 Version 1.0
  • /api/users?api-version=2.0 返回 Version 2.0
  • 请求头中添加 api-version: 3.0,返回 Version 3.0

总结

ASP.NET Core WebAPI 中实现版本控制的方式包括:

  1. URL 路径版本控制:将版本号嵌入 URL 路径。
  2. 查询字符串版本控制:将版本号作为查询参数传递。
  3. 请求头版本控制:将版本号放在 HTTP 请求头中。
  4. 媒体类型版本控制 :将版本号嵌入到 Accept 请求头中。
  5. 组合多种方式:同时支持多种版本控制方式。

通过版本控制,我们可以更好地管理 API 的演进,确保新旧版本的兼容性,同时为客户端提供清晰的版本选择。

相关推荐
.NET修仙日记5 天前
第一章:从零开始构建你的第一个C#/.NET应用程序
c#·.net·.net core
切糕师学AI6 天前
C# 使用 CSRedisCore指南
redis·c#·.net core
时光追逐者10 天前
全面的 C#/.NET 图表构建解决方案,助力快速实现图表开发需求!
微软·c#·.net·.net core·图表
.NET修仙日记13 天前
C#/.NET 微服务架构:从入门到精通的完整学习路线
微服务·c#·.net·.net core·分布式架构·技术进阶
.NET修仙日记17 天前
.NET WinForms + WPF 综合学习路线:从传统到现代的.NET桌面开发
学习·c#·.net·wpf·.net core·winforms
EdisonZhou1 个月前
多Agent协作入门:基于A2A协议的Agent通信(下)
aigc·agent·.net core
EdisonZhou1 个月前
多Agent协作入门:基于A2A协议的Agent通信(中)
aigc·agent·.net core
时光追逐者1 个月前
一个基于 .NET 开源、简易、轻量级的进销存管理系统
开源·c#·.net·.net core·经销存管理系统
追逐时光者2 个月前
C#/.NET/.NET Core技术前沿周刊 | 第 55 期(2025年9.15-9.21)
.net core·【.net】·【c#】·【技术前沿周刊】
hez20102 个月前
Runtime Async - 步入高性能异步时代
c#·.net·.net core·clr