在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#正则表达式获取下拉菜单(select)的相关属性值

    C#正则表达式获取下拉菜单(select)的相关属性值

    这篇文章主要介绍了C#正则表达式获取下拉菜单(select)的相关属性值,比如可以获得name属性的值、value值、指定值,需要的朋友可以参考下
    2014-07-07
  • unity实现鼠标跟随(ITween)

    unity实现鼠标跟随(ITween)

    这篇文章主要为大家详细介绍了unity实现鼠标跟随,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#实现将json转换为DataTable的方法

    C#实现将json转换为DataTable的方法

    这篇文章主要介绍了C#实现将json转换为DataTable的方法,涉及C#操作json及DataTable的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • C# 类型转换(隐式类型,显式类型,自定义类型)

    C# 类型转换(隐式类型,显式类型,自定义类型)

    本文详细介绍了C#中的类型转换,包括隐式类型转换和显式类型转换(强制类型转换),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • 深入浅析C# 11 对 ref 和 struct 的改进

    深入浅析C# 11 对 ref 和 struct 的改进

    这篇文章主要介绍了C# 11 对 ref 和 struct 的改进,有了这些基础设施,开发者们将能轻松使用安全的方式来编写没有任何堆内存开销的高性能代码,需要的朋友可以参考下
    2022-04-04
  • C#多线程开发实战记录之线程基础

    C#多线程开发实战记录之线程基础

    线程是一个独立的运行单元,每个进程内部有多个线程,每个线程可以各自同时执行指令,每个线程有自己独立的栈,但是与进程内的其他线程共享内存,这篇文章主要给大家介绍了关于C#多线程开发实战记录之线程基础的相关资料,需要的朋友可以参考下
    2021-09-09
  • C#实现简单订单管理程序

    C#实现简单订单管理程序

    这篇文章主要为大家详细介绍了C#实现简单订单管理程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 使用C#代码计算数学表达式实例

    使用C#代码计算数学表达式实例

    这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来执行表达式计算,该方法通过查找优先级最低的运算符来拆分表达式,并递归调用自身来评估子表达式
    2025-01-01
  • c# 对windows用户和组操作实例

    c# 对windows用户和组操作实例

    c# 对windows用户和组操作实例,需要的朋友可以参考一下
    2013-04-04
  • C#延迟执行方法函数实例讲解

    C#延迟执行方法函数实例讲解

    这篇文章主要介绍了C#延迟执行方法函数实例讲解,这是比较常用的函数,有需要的同学可以研究下
    2021-03-03

最新评论