在C#?WebAPI中實(shí)現(xiàn)多版本控制的方法
引言
隨著應(yīng)用程序的不斷演化和功能的不斷擴(kuò)展,API 版本控制成為了開發(fā)和維護(hù) WebAPI 時(shí)不可或缺的一部分。API 版本控制允許開發(fā)者在不破壞現(xiàn)有功能的情況下對(duì) API 進(jìn)行更新和優(yōu)化,是實(shí)現(xiàn)向后兼容性和持續(xù)交付的關(guān)鍵。
在本文中,我們將介紹如何在現(xiàn)代 C# WebAPI 項(xiàng)目中有效地實(shí)施 API 版本控制,并分享一些最佳實(shí)踐,幫助開發(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 包。你可以通過 NuGet 管理器或者使用以下命令安裝:

第二步:創(chuàng)建擴(kuò)展方法(AddSwaggerGenWithVersioning)
通過擴(kuò)展方法來封裝 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)用程序后,訪問
http://localhost:5000/swagger。 - 你將看到 Swagger UI,能夠選擇
v1或v2版本的 API 來進(jìn)行測(cè)試

總結(jié)
- API 版本控制:通過配置
AddApiVersioning,你可以實(shí)現(xiàn)路徑、查詢參數(shù)、請(qǐng)求頭等多種版本控制方式,確保不同版本的 API 不會(huì)相互干擾。 - Swagger 配置:通過擴(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#正則表達(dá)式獲取下拉菜單(select)的相關(guān)屬性值
這篇文章主要介紹了C#正則表達(dá)式獲取下拉菜單(select)的相關(guān)屬性值,比如可以獲得name屬性的值、value值、指定值,需要的朋友可以參考下2014-07-07
unity實(shí)現(xiàn)鼠標(biāo)跟隨(ITween)
這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)鼠標(biāo)跟隨,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
C#實(shí)現(xiàn)將json轉(zhuǎn)換為DataTable的方法
這篇文章主要介紹了C#實(shí)現(xiàn)將json轉(zhuǎn)換為DataTable的方法,涉及C#操作json及DataTable的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
C# 類型轉(zhuǎn)換(隱式類型,顯式類型,自定義類型)
本文詳細(xì)介紹了C#中的類型轉(zhuǎn)換,包括隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換(強(qiáng)制類型轉(zhuǎn)換),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
深入淺析C#?11?對(duì)?ref?和?struct?的改進(jìn)
這篇文章主要介紹了C#?11?對(duì)?ref?和?struct?的改進(jìn),有了這些基礎(chǔ)設(shè)施,開發(fā)者們將能輕松使用安全的方式來編寫沒有任何堆內(nèi)存開銷的高性能代碼,需要的朋友可以參考下2022-04-04
C#多線程開發(fā)實(shí)戰(zhàn)記錄之線程基礎(chǔ)
線程是一個(gè)獨(dú)立的運(yùn)行單元,每個(gè)進(jìn)程內(nèi)部有多個(gè)線程,每個(gè)線程可以各自同時(shí)執(zhí)行指令,每個(gè)線程有自己獨(dú)立的棧,但是與進(jìn)程內(nèi)的其他線程共享內(nèi)存,這篇文章主要給大家介紹了關(guān)于C#多線程開發(fā)實(shí)戰(zhàn)記錄之線程基礎(chǔ)的相關(guān)資料,需要的朋友可以參考下2021-09-09
使用C#代碼計(jì)算數(shù)學(xué)表達(dá)式實(shí)例
這段文字主要講述了如何使用C#語言來計(jì)算數(shù)學(xué)表達(dá)式,該程序通過使用Dictionary保存變量,定義了運(yùn)算符優(yōu)先級(jí),并實(shí)現(xiàn)了EvaluateExpression方法來執(zhí)行表達(dá)式計(jì)算,該方法通過查找優(yōu)先級(jí)最低的運(yùn)算符來拆分表達(dá)式,并遞歸調(diào)用自身來評(píng)估子表達(dá)式2025-01-01

