.NET?10?使用?Microsoft.AspNetCore.OpenApi?實(shí)現(xiàn)?API?版本管理的過(guò)程詳解
為什么 API 版本管理如此重要?
API 版本管理的核心目標(biāo)是:在不破壞現(xiàn)有用戶的前提下,持續(xù)迭代和改進(jìn) API。通過(guò)版本管理,我們可以:
- 引入新功能:在新版本中添加字段、接口等,而不影響舊版本的用戶。
- 修復(fù) bug:在新版本中修復(fù)問(wèn)題,而不冒破壞舊版本的風(fēng)險(xiǎn)。
- 逐步淘汰:在新版本中移除過(guò)時(shí)的功能,給用戶足夠的時(shí)間遷移。
常見(jiàn)的版本策略有這幾種:
- URL 路徑版本:
/api/v1/users,直觀,最常見(jiàn) - 查詢參數(shù)版本:
/api/users?api-version=1.0 - 請(qǐng)求頭版本:
X-API-Version: 1.0 - 媒體類型版本:
Accept: application/json; v=1.0(GitHub 在用這種方式)
每種方式都有適用場(chǎng)景,沒(méi)有絕對(duì)的優(yōu)劣。
在 C# 生態(tài)中,長(zhǎng)期以來(lái)的事實(shí)標(biāo)準(zhǔn)是 Swashbuckle.AspNetCore,但它并沒(méi)有內(nèi)置版本管理支持,需要配合 Asp.Versioning 來(lái)實(shí)現(xiàn)。
終于,在 .NET 10 中,微軟推出了自己的 OpenAPI 庫(kù) Microsoft.AspNetCore.OpenApi,并且 Asp.Versioning v10 也正式支持了這個(gè)庫(kù),版本管理和文檔生成終于可以無(wú)縫結(jié)合了。
上手 Microsoft.AspNetCore.OpenApi 和 Asp.Versioning
要使用 Microsoft.AspNetCore.OpenApi 和 Asp.Versioning 來(lái)實(shí)現(xiàn) API 版本管理,首先需要安裝相關(guān) NuGet 包:
#package: Asp.Versioning.Http 10.0.0 #package: Asp.Versioning.Mvc 10.0.0 #package: Asp.Versioning.Mvc.ApiExplorer 10.0.0 #package: Microsoft.AspNetCore.OpenApi 10.0.0 #package: Scalar.AspNetCore 2.6.0
安裝完成后,在 Program.cs 中進(jìn)行如下配置:
services
.AddApiVersioning(options =>
{
options.DefaultApiVersion = new ApiVersion(1, 0);
options.AssumeDefaultVersionWhenUnspecified = true;
options.ReportApiVersions = true;
options.ApiVersionReader = new UrlSegmentApiVersionReader();
})
.AddMvc()
.AddApiExplorer(options =>
{
options.GroupNameFormat = "'v'V";
options.SubstituteApiVersionInUrl = true;
});
services.AddOpenApi("v1", options =>
{
options.ShouldInclude = apiDescription => apiDescription.GroupName == "v1";
});
services.AddOpenApi("v2", options =>
{
options.ShouldInclude = apiDescription => apiDescription.GroupName == "v2";
});
app.MapOpenApi();
app.MapScalarApiReference(options =>
{
options
.WithTitle("Users API - {documentName}")
.AddDocuments(new[] { "v1", "v2" });
});在上面的代碼中,我們首先配置了 API 版本管理,指定了默認(rèn)版本、版本讀取方式等。然后,我們?yōu)槊總€(gè)版本配置了 OpenAPI 文檔生成,確保每個(gè)版本都有獨(dú)立的文檔。最后,我們映射了 OpenAPI 和 Scalar API Reference 的路由。
控制器方面,我們可以使用特性來(lái)指定版本:
[ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("1.0")]
public class UsersController : ControllerBase
{
[HttpGet]
[MapToApiVersion("1.0")]
public IActionResult GetV1()
{
return Ok(new { Version = "v1", Users = new[] { "Alice", "Bob" } });
}
}
[ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("2.0")]
public class UsersV2Controller : ControllerBase
{
[HttpGet]
[MapToApiVersion("2.0")]
public IActionResult GetV2()
{
return Ok(new { Version = "v2", Users = new[] { "Alice", "Bob", "Charlie" } });
}
}通過(guò)上述配置,我們就實(shí)現(xiàn)了基于 URL 路徑的 API 版本管理,并且每個(gè)版本都有獨(dú)立的 OpenAPI 文檔。
這里還使用了一個(gè)叫 Scalar 的庫(kù)來(lái)生成 API 參考文檔。Scalar 是一個(gè)專注于生成 API 參考文檔的庫(kù),支持多版本文檔生成和定制化配置。通過(guò) Scalar,我們可以輕松地為每個(gè) API 版本生成漂亮的參考文檔,方便開(kāi)發(fā)者查閱。
上一張 Scalar 的圖(和本項(xiàng)目無(wú)關(guān))

我把實(shí)驗(yàn)項(xiàng)目的代碼放在了 GitHub 上,歡迎大家參考:
https://github.com/denglei1024/openapi-apiversion
到此這篇關(guān)于.NET 10 使用 Microsoft.AspNetCore.OpenApi 實(shí)現(xiàn) API 版本管理的過(guò)程詳解的文章就介紹到這了,更多相關(guān).net 使用microsoft.aspnetcore.openapi內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.NET MVC分頁(yè)和排序功能實(shí)現(xiàn)
這篇文章主要介紹了MVC學(xué)習(xí)系列之分頁(yè)和排序功能實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07
如何在ASP.NET Core應(yīng)用程序運(yùn)行Vue并且部署在IIS上詳解
這篇文章主要給大家介紹了關(guān)于如何運(yùn)行Vue在ASP.NET Core應(yīng)用程序并且部署在IIS上的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
DataList中TextBox onfocus調(diào)用后臺(tái)void靜態(tài)方法及獲取相應(yīng)行數(shù)
DataList中我放了一個(gè)TextBox 現(xiàn)在的問(wèn)題是當(dāng)我光標(biāo)放到TextBox上的時(shí)候。如果讓onfocus調(diào)用后臺(tái)某一個(gè)void靜態(tài)方法并且在靜態(tài)方法里邊獲取光標(biāo)相應(yīng)的DataList的相應(yīng)行數(shù),本文介紹如何實(shí)現(xiàn),感興趣的朋友可以了解下2013-01-01
C#實(shí)現(xiàn)把圖片下載到服務(wù)器代碼
本文給大家分享的是實(shí)現(xiàn)這樣一個(gè)功能,想將遠(yuǎn)程服務(wù)器的圖片下載到本地主機(jī),圖片的名稱就是數(shù)據(jù)庫(kù)的一個(gè)字段,圖片不是以二進(jìn)制的形式存儲(chǔ)在數(shù)據(jù)庫(kù)的,數(shù)據(jù)庫(kù)存儲(chǔ)的只是圖片的名詞。2015-11-11
Asp.net使用SignalR實(shí)現(xiàn)酷炫端對(duì)端聊天功能
這篇文章主要為大家詳細(xì)介紹了Asp.net使用SignalR實(shí)現(xiàn)酷炫端對(duì)端聊天功能,感興趣的小伙伴們可以參考一下2016-04-04
asp.net中一次性動(dòng)態(tài)綁定多個(gè)droplistdown
asp.net中一次性動(dòng)態(tài)綁定多個(gè)droplistdown的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-10-10
ASP.NET中Webservice安全 實(shí)現(xiàn)訪問(wèn)權(quán)限控制
本文主要講解ASP.NET中的Webservice的安全設(shè)置兩種方法,一種基于soapheader,一種基于SoapExtensionAttribute,需要的朋友可以參考下。2016-05-05

