在C# WebAPI中实现多版本控制的方法

 更新时间:2025年11月06日 09:51:49   作者:一叶星殇  
随着应用程序的不断演化和功能的不断扩展,API 版本控制成为了开发和维护 WebAPI 时不可或缺的一部分,在本文中,我们将介绍如何在现代 C# WebAPI 项目中有效地实施 API 版本控制,并分享一些最佳实践,需要的朋友可以参考下

引言

随着应用程序的不断演化和功能的不断扩展,API 版本控制成为了开发和维护 WebAPI 时不可或缺的一部分。API 版本控制允许开发者在不破坏现有功能的情况下对 API 进行更新和优化,是实现向后兼容性和持续交付的关键。

在本文中,我们将介绍如何在现代 C# WebAPI 项目中有效地实施 API 版本控制,并分享一些最佳实践,帮助开发者设计、实现和维护可扩展和易于管理的 API

在 WebAPI 中实现多个版本,可以让你灵活管理 API 的变化,同时保持向后兼容。

第一步:安装必要的 NuGet 包(选择对应的.net版本,这里我用的是.Net 6)

首先,确保你的项目中已经安装了 Microsoft.AspNetCore.Mvc.Versioning 这个 NuGet 包。你可以通过 NuGet 管理器或者使用以下命令安装:

第二步:创建扩展方法(AddSwaggerGenWithVersioning)

通过扩展方法来封装 Swagger 多版本配置。这样可以让 Program.cs 中的配置更加简洁和可复用。

创建一个 SwaggerServiceExtensions.cs 文件:

using Asp.Versioning;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
 
namespace MyApiDemo.Common.Extensions
{
    /// <summary>
    /// swagger服务扩展
    /// </summary>
    public static class SwaggerServiceExtensions
    {
        /// <summary>
        /// 控制swagger多版本生成
        /// </summary>
        /// <param name="services"></param>
        /// <param name="apiVersions"></param>
        public static void AddSwaggerGenWithVersioning(this IServiceCollection services, string[] apiVersions)
        {
            services.AddSwaggerGen(m =>
            {
                // XML 注释文件
                string xmlPath = Path.Combine(AppContext.BaseDirectory, "MyApiDemo.xml");
                if (File.Exists(xmlPath))
                    m.IncludeXmlComments(xmlPath, true);
                // 注册每个版本
                foreach (var version in apiVersions)
                {
                    m.SwaggerDoc(version, new OpenApiInfo
                    {
                        Title = $"My API {version.ToUpper()}",
                        Version = version
                    });
                }
 
                // 冲突处理
                m.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
 
                // 根据控制器上的 ApiVersionAttribute 筛选文档
                m.DocInclusionPredicate((docName, apiDesc) =>
                {
                    if (!apiDesc.TryGetMethodInfo(out var methodInfo)) return false;
 
                    var versions = methodInfo.DeclaringType?
                        .GetCustomAttributes(true)
                        .OfType<ApiVersionAttribute>()
                        .SelectMany(attr => attr.Versions)
                        .Select(v => $"v{v.MajorVersion}")
                        .ToList();
 
                    return versions?.Contains(docName) ?? false;
                });
 
            });
        }
 
    }
}

第三步:配置 Program.cs

在 Program.cs 中进行配置,首先添加上面的扩展方法,然后配置 ApiVersioning 和 Swagger。

完整的 Program.cs 配置:

using Asp.Versioning;
using MyApiDemo.Common.Extensions;
 
var builder = WebApplication.CreateBuilder(args);
 
// 添加服务到容器
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
 
// 配置 API 版本控制
builder.Services.AddApiVersioning(options =>
{
    options.DefaultApiVersion = new ApiVersion(1, 0); // 默认版本为 1.0
    options.AssumeDefaultVersionWhenUnspecified = true; // 未指定版本时使用默认版本
    options.ReportApiVersions = true; // 返回支持的版本信息
    options.ApiVersionReader = ApiVersionReader.Combine(
        new QueryStringApiVersionReader("version"), // 从查询字符串读取版本号
        new UrlSegmentApiVersionReader(), // 从 URL 路径读取版本号
        new HeaderApiVersionReader("X-API-Version"), // 从请求头读取版本号
        new MediaTypeApiVersionReader("version") // 从媒体类型读取版本号
    );
});
 
// 配置 Swagger 多版本生成
var apiVersions = new[] { "v1", "v2" };
builder.Services.AddSwaggerGenWithVersioning(apiVersions);
 
var app = builder.Build();
 
// 启用 Swagger 和 Swagger UI
app.UseSwagger();
app.UseSwaggerUI(options =>
{
    foreach (var version in apiVersions)
    {
        options.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"My API {version.ToUpper()}");
    }
});
 
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

第四步:创建版本控制的控制器

根据版本需求创建不同版本的控制器,例如:

// API v1
[ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("1.0")]
public class ProductsControllerV1 : ControllerBase
{
    [HttpGet]
    public IActionResult GetProducts()
    {
        return Ok(new { Message = "This is version 1.0" });
    }
}
 
// API v2
[ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("2.0")]
public class ProductsControllerV2 : ControllerBase
{
    [HttpGet]
    public IActionResult GetProducts()
    {
        return Ok(new { Message = "This is version 2.0 with new features!" });
    }
}

第五步:测试 API

  • 运行应用程序后,访问 http://localhost:5000/swagger
  • 你将看到 Swagger UI,能够选择 v1 或 v2 版本的 API 来进行测试

总结

  • API 版本控制:通过配置 AddApiVersioning,你可以实现路径、查询参数、请求头等多种版本控制方式,确保不同版本的 API 不会相互干扰。
  • Swagger 配置:通过扩展方法 AddSwaggerGenWithVersioning,你可以为多个 API 版本生成 Swagger 文档,并在 Swagger UI 中展示不同版本的 API。

这样,你就可以轻松管理和展示多个版本的 API,同时确保 API 兼容性和安全性。

到此这篇关于在C# WebAPI中实现多版本控制的方法的文章就介绍到这了,更多相关C# WebAPI多版本控制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#利用反射实现多数据库访问

    C#利用反射实现多数据库访问

    本文详细讲解了C#利用反射实现多数据库访问的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C#判断一个字符串是否是数字或者含有某个数字的方法

    C#判断一个字符串是否是数字或者含有某个数字的方法

    这篇文章主要介绍了C#判断一个字符串是否是数字或者含有某个数字的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • C#中读写INI文件的方法例子

    C#中读写INI文件的方法例子

    C#中读写INI文件的方法例子,需要的朋友可以参考一下
    2013-05-05
  • C#实现块状链表的项目实践

    C#实现块状链表的项目实践

    这篇文章主要介绍了C#实现块状链表的项目实践,通过定义块和链表类,利用块内元素引用实现块与块之间的链接关系,从而实现对块状链表的遍历、插入和删除等操作,感兴趣的可以了解一下
    2023-11-11
  • Unity C#执行bat脚本的操作

    Unity C#执行bat脚本的操作

    这篇文章主要介绍了Unity C#执行bat脚本的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • unity实现简单贪吃蛇游戏

    unity实现简单贪吃蛇游戏

    这篇文章主要为大家详细介绍了unity实现简单贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 详解如何将.NET应用转换成Window服务

    详解如何将.NET应用转换成Window服务

    这篇文章主要为大家详细介绍了如何将.NET8.0应用程序转换成Windows服务,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • C#实现的调用DOS命令操作类实例

    C#实现的调用DOS命令操作类实例

    这篇文章主要介绍了C#实现的调用DOS命令操作类,实例分析了C#调用系统常用DOS命令的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • Unity实现人物平滑转身

    Unity实现人物平滑转身

    这篇文章主要为大家详细介绍了Unity实现人物平滑转身,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • C#中Assembly类的使用小结

    C#中Assembly类的使用小结

    本文主要介绍了C#中Assembly类详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03

最新评论