在C#?WebAPI中實(shí)現(xiàn)多版本控制的方法
引言
隨著應(yīng)用程序的不斷演化和功能的不斷擴(kuò)展,API 版本控制成為了開(kāi)發(fā)和維護(hù) WebAPI 時(shí)不可或缺的一部分。API 版本控制允許開(kāi)發(fā)者在不破壞現(xiàn)有功能的情況下對(duì) API 進(jìn)行更新和優(yōu)化,是實(shí)現(xiàn)向后兼容性和持續(xù)交付的關(guān)鍵。
在本文中,我們將介紹如何在現(xiàn)代 C# WebAPI 項(xiàng)目中有效地實(shí)施 API 版本控制,并分享一些最佳實(shí)踐,幫助開(kāi)發(fā)者設(shè)計(jì)、實(shí)現(xiàn)和維護(hù)可擴(kuò)展和易于管理的 API
在 WebAPI 中實(shí)現(xiàn)多個(gè)版本,可以讓你靈活管理 API 的變化,同時(shí)保持向后兼容。
第一步:安裝必要的 NuGet 包(選擇對(duì)應(yīng)的.net版本,這里我用的是.Net 6)
首先,確保你的項(xiàng)目中已經(jīng)安裝了 Microsoft.AspNetCore.Mvc.Versioning 這個(gè) NuGet 包。你可以通過(guò) NuGet 管理器或者使用以下命令安裝:

第二步:創(chuàng)建擴(kuò)展方法(AddSwaggerGenWithVersioning)
通過(guò)擴(kuò)展方法來(lái)封裝 Swagger 多版本配置。這樣可以讓 Program.cs 中的配置更加簡(jiǎn)潔和可復(fù)用。
創(chuàng)建一個(gè) SwaggerServiceExtensions.cs 文件:
using Asp.Versioning;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace MyApiDemo.Common.Extensions
{
/// <summary>
/// swagger服務(wù)擴(kuò)展
/// </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);
// 注冊(cè)每個(gè)版本
foreach (var version in apiVersions)
{
m.SwaggerDoc(version, new OpenApiInfo
{
Title = $"My API {version.ToUpper()}",
Version = version
});
}
// 沖突處理
m.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
// 根據(jù)控制器上的 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 中進(jìn)行配置,首先添加上面的擴(kuò)展方法,然后配置 ApiVersioning 和 Swagger。
完整的 Program.cs 配置:
using Asp.Versioning;
using MyApiDemo.Common.Extensions;
var builder = WebApplication.CreateBuilder(args);
// 添加服務(wù)到容器
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
// 配置 API 版本控制
builder.Services.AddApiVersioning(options =>
{
options.DefaultApiVersion = new ApiVersion(1, 0); // 默認(rèn)版本為 1.0
options.AssumeDefaultVersionWhenUnspecified = true; // 未指定版本時(shí)使用默認(rèn)版本
options.ReportApiVersions = true; // 返回支持的版本信息
options.ApiVersionReader = ApiVersionReader.Combine(
new QueryStringApiVersionReader("version"), // 從查詢字符串讀取版本號(hào)
new UrlSegmentApiVersionReader(), // 從 URL 路徑讀取版本號(hào)
new HeaderApiVersionReader("X-API-Version"), // 從請(qǐng)求頭讀取版本號(hào)
new MediaTypeApiVersionReader("version") // 從媒體類型讀取版本號(hào)
);
});
// 配置 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();第四步:創(chuàng)建版本控制的控制器
根據(jù)版本需求創(chuàng)建不同版本的控制器,例如:
// 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!" });
}
}第五步:測(cè)試 API
- 運(yùn)行應(yīng)用程序后,訪問(wèn)
http://localhost:5000/swagger。 - 你將看到 Swagger UI,能夠選擇
v1或v2版本的 API 來(lái)進(jìn)行測(cè)試

總結(jié)
- API 版本控制:通過(guò)配置
AddApiVersioning,你可以實(shí)現(xiàn)路徑、查詢參數(shù)、請(qǐng)求頭等多種版本控制方式,確保不同版本的 API 不會(huì)相互干擾。 - Swagger 配置:通過(guò)擴(kuò)展方法
AddSwaggerGenWithVersioning,你可以為多個(gè) API 版本生成 Swagger 文檔,并在 Swagger UI 中展示不同版本的 API。
這樣,你就可以輕松管理和展示多個(gè)版本的 API,同時(shí)確保 API 兼容性和安全性。
到此這篇關(guān)于在C# WebAPI中實(shí)現(xiàn)多版本控制的方法的文章就介紹到這了,更多相關(guān)C# WebAPI多版本控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#利用反射實(shí)現(xiàn)多數(shù)據(jù)庫(kù)訪問(wèn)
本文詳細(xì)講解了C#利用反射實(shí)現(xiàn)多數(shù)據(jù)庫(kù)訪問(wèn)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
C#判斷一個(gè)字符串是否是數(shù)字或者含有某個(gè)數(shù)字的方法
這篇文章主要介紹了C#判斷一個(gè)字符串是否是數(shù)字或者含有某個(gè)數(shù)字的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
C#實(shí)現(xiàn)塊狀鏈表的項(xiàng)目實(shí)踐
這篇文章主要介紹了C#實(shí)現(xiàn)塊狀鏈表的項(xiàng)目實(shí)踐,通過(guò)定義塊和鏈表類,利用塊內(nèi)元素引用實(shí)現(xiàn)塊與塊之間的鏈接關(guān)系,從而實(shí)現(xiàn)對(duì)塊狀鏈表的遍歷、插入和刪除等操作,感興趣的可以了解一下2023-11-11
unity實(shí)現(xiàn)簡(jiǎn)單貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)簡(jiǎn)單貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
詳解如何將.NET應(yīng)用轉(zhuǎn)換成Window服務(wù)
這篇文章主要為大家詳細(xì)介紹了如何將.NET8.0應(yīng)用程序轉(zhuǎn)換成Windows服務(wù),文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
C#實(shí)現(xiàn)的調(diào)用DOS命令操作類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的調(diào)用DOS命令操作類,實(shí)例分析了C#調(diào)用系統(tǒng)常用DOS命令的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
Unity實(shí)現(xiàn)人物平滑轉(zhuǎn)身
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)人物平滑轉(zhuǎn)身,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01

