.NET實(shí)現(xiàn)API版本控制
1. 優(yōu)點(diǎn)
- 有助于保護(hù)原有系統(tǒng),不受影響,并及時(shí)修改問(wèn)題
- 可以實(shí)現(xiàn)用戶(hù)的私人定制(比如是付費(fèi)接口)
- 快速迭代
2. API版本控制
- 在URL中追加版本或者作為查詢(xún)字符串參數(shù)
- 通過(guò)自動(dòng)以標(biāo)頭和通過(guò)接受標(biāo)頭
2.1 安裝組件
ASP.NET API versioning為您提供了一種功能強(qiáng)大但易于使用的方法,用于將API版本控制語(yǔ)義添加到使用ASP.NET構(gòu)建的新的和現(xiàn)有的REST服務(wù)中。API版本控制擴(kuò)展定義了簡(jiǎn)單的元數(shù)據(jù)屬性和約定,用于描述您的服務(wù)實(shí)現(xiàn)了哪些API版本。
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="4.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="4.2.0" />2.1.1 常用配置
[ApiVersion("1.1")] //設(shè)置版本號(hào)
[ApiVersionNeutral]//退出版本控制
[MapToApiVersion("1.1")] //設(shè)置獨(dú)立版本
[ApiVersion("1.0", Deprecated = true)]//api版本已經(jīng)被棄用
HttpContext.GetRequestedApiVersion().ToString(); //訪(fǎng)問(wèn)版本信息 2.2 QueryString來(lái)實(shí)現(xiàn)版本控制
2.2.1 ConfigureServices中配置
//Versioning用來(lái)實(shí)現(xiàn)API的版本控制
services.AddApiVersioning(options =>
{
options.DefaultApiVersion = new ApiVersion(1, 1);//默認(rèn)版本號(hào)
options.AssumeDefaultVersionWhenUnspecified = true;//此選項(xiàng)將用于不提供版本的請(qǐng)求,默認(rèn)情況下假定API的版本為1.0
options.ReportApiVersions = true;//當(dāng)設(shè)置為true時(shí)候,api將返回響應(yīng)標(biāo)頭中支持的版本信息
//下面這句默認(rèn)不寫(xiě)也可以
//options.ApiVersionReader = new QueryStringApiVersionReader(parameterNames: "api-version");//該名稱(chēng)用于查詢(xún)時(shí)候使用
});2.2.2 控制器設(shè)置版本
namespace NetCore_SwaggerVersion.Controllers.v1
{
/// <summary>
/// 版本1.1
/// </summary>
[Route("api/[controller]")]
[ApiController]
[ApiVersion("1.1")]//可以設(shè)置多個(gè)
[ApiVersion("1.2")]
public class TestController : ControllerBase
namespace NetCore_SwaggerVersion.Controllers.v2
{
/// <summary>
/// 版本2.0
/// </summary>
[Route("api/[controller]")]
[ApiController]
[ApiVersion("2.6")]
public class TestController : ControllerBase
不同命名空間下可以存在相同的控制器
2.2.3 特定方法設(shè)置版本
[MapToApiVersion("1.1")]
[HttpGet]
public IEnumerable<string> Get()2.2.4 設(shè)置不受版本控制
[ApiVersionNeutral]//退出版本控制
[ApiController]
[Route("api/[controller]/[action]")]
public class WeatherForecastController : ControllerBase2.3.5 訪(fǎng)問(wèn)地址
http://localhost:5000/api/WeatherForecast/Get //不寫(xiě)版本號(hào)的話(huà)走的是默認(rèn)的版本號(hào) http://localhost:5000/api/Test?api-version=1.1 http://localhost:5000/api/Test?api-version=1.2 http://localhost:5000/api/Test?api-version=2.6
2.3 URL Path Segment來(lái)實(shí)現(xiàn)版本控制
2.3.1 ConfigureServices中配置
//Versioning用來(lái)實(shí)現(xiàn)API的版本控制
services.AddApiVersioning(options =>
{
options.DefaultApiVersion = new ApiVersion(1, 1);//默認(rèn)版本號(hào)
options.AssumeDefaultVersionWhenUnspecified = true;//此選項(xiàng)將用于不提供版本的請(qǐng)求,默認(rèn)情況下假定API的版本為1.0
options.ReportApiVersions = true;//當(dāng)設(shè)置為true時(shí)候,api將返回響應(yīng)標(biāo)頭中支持的版本信息
});2.3.2 控制器設(shè)置版本
namespace NetCore_SwaggerVersion.Controllers.v1
{
/// <summary>
/// 版本1.1
/// </summary>
[Route("api/v{version:apiVersion}/[controller]")]
[ApiController]
[ApiVersion("1.0")]
[ApiVersion("1.1")]//定義控制器提供哪個(gè)版本的API
public class TestController : ControllerBase
namespace NetCore_SwaggerVersion.Controllers.v2
{
/// <summary>
/// 版本2.0
/// </summary>
[Route("api/v{version:apiVersion}/[controller]")]
[ApiController]
[ApiVersion("2.6")]
public class TestController : ControllerBase
不同命名空間下可以存在相同的控制器
2.3.3 特定方法設(shè)置版本
[MapToApiVersion("1.1")]
[HttpGet]
public IEnumerable<string> Get()2.3.4 設(shè)置不受版本控制
[ApiVersionNeutral]//退出版本控制
[ApiController]
[Route("api/[controller]/[action]")]
public class WeatherForecastController : ControllerBase2.3.5 訪(fǎng)問(wèn)地址
http://localhost:5000/api/v1.0/Test http://localhost:5000/api/v1.1/Test http://localhost:5000/api/v2.6/Test http://localhost:5000/api/WeatherForecast/Get 不受版本控制
2.4 HTTP Headers來(lái)實(shí)現(xiàn)版本控制
2.4.1 ConfigureServices中配置
//Versioning用來(lái)實(shí)現(xiàn)API的版本控制
services.AddApiVersioning(options =>
{
options.DefaultApiVersion = new ApiVersion(1, 1);//默認(rèn)版本號(hào)
options.AssumeDefaultVersionWhenUnspecified = true;//此選項(xiàng)將用于不提供版本的請(qǐng)求,默認(rèn)情況下假定API的版本為1.0
options.ReportApiVersions = true;//當(dāng)設(shè)置為true時(shí)候,api將返回響應(yīng)標(biāo)頭中支持的版本信息
//header傳遞版本信息
options.ApiVersionReader = new HeaderApiVersionReader("version");
options.ApiVersionSelector = new CurrentImplementationApiVersionSelector(options);//如果沒(méi)有傳輸版本號(hào),那么會(huì)使用最大版本號(hào) LowestImplementedApiVersionSelector是最小版本號(hào)
options.UseApiBehavior = false;//是否使用API行為
});2.4.2 控制器設(shè)置版本
namespace NetCore_SwaggerVersion.Controllers.v1
{
/// <summary>
/// 版本1.1
/// </summary>
[Route("api/[controller]")]
[ApiController]
[ApiVersion("1.1")]//定義控制器提供哪個(gè)版本的API
public class TestController : ControllerBase
namespace NetCore_SwaggerVersion.Controllers.v2
{
/// <summary>
/// 版本2.0
/// </summary>
[Route("api/[controller]")]
[ApiController]
[ApiVersion("2.6")]
public class TestController : ControllerBase不同命名空間下可以存在相同的控制器
2.4.3 特定方法設(shè)置版本
[MapToApiVersion("1.1")]
[HttpGet]
public IEnumerable<string> Get()2.4.4 設(shè)置不受版本控制
[ApiVersionNeutral]//退出版本控制
[ApiController]
[Route("api/[controller]/[action]")]
public class WeatherForecastController : ControllerBase2.4.5 訪(fǎng)問(wèn)地址
http://localhost:5000/api/Test //需要在headers里面增加 version: 1.1 http://localhost:5000/api/WeatherForecast/Get 不受版本控制
2.5 同時(shí)支持多種模式
services.AddApiVersioning(o =>
{
o.ReportApiVersions = true;
o.AssumeDefaultVersionWhenUnspecified = true;
o.DefaultApiVersion = new ApiVersion(1, 0);
o.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"), new QueryStringApiVersionReader("api-version"));
//或者
//同時(shí)支持查詢(xún)字符串和標(biāo)頭
o.ApiVersionReader = new QueryStringOrHeaderApiVersionReader(parameterName: "version"){HeaderNames = { "api-version", "x-ms-version" }}
});2.6 不借助包,封裝文件
public class NameSpaceVersionRoutingConvention:IApplicationModelConvention
{
private readonly string apiPrefix;
private const string urlTemplate = "{0}/{1}/{2}";
public NameSpaceVersionRoutingConvention(string apiPrefix = "api")
{
this.apiPrefix = apiPrefix;
}
public void Apply(ApplicationModel application)
{
foreach (var controller in application.Controllers)
{
var hasRouteAttribute = controller.Selectors
.Any(x => x.AttributeRouteModel != null);
if (!hasRouteAttribute)
{
continue;
}
var nameSpaces = controller.ControllerType.Namespace.Split('.');
//獲取namespace中版本號(hào)部分
var version = nameSpaces.FirstOrDefault(x => Regex.IsMatch(x, @"^v(\d+)$"));
if (string.IsNullOrEmpty(version))
{
continue;
}
string template = string.Format(urlTemplate, apiPrefix, version,
controller.ControllerName);
controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel()
{
Template = template
};
}
}
}調(diào)試代碼發(fā)現(xiàn)這種方式只在程序第一次運(yùn)行的時(shí)候會(huì)執(zhí)行,之后不會(huì)再執(zhí)行多次,因此效率很高。
到此這篇關(guān)于.NET實(shí)現(xiàn)API版本控制的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.NET?Core實(shí)現(xiàn)動(dòng)態(tài)獲取文件并下載
這篇文章介紹了ASP.NET?Core實(shí)現(xiàn)動(dòng)態(tài)獲取文件并下載的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01
關(guān)于.NET Attribute在數(shù)據(jù)校驗(yàn)中的應(yīng)用教程
這篇文章主要給大家介紹了關(guān)于.NET Attribute在數(shù)據(jù)校驗(yàn)中的應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.NET具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Asp.Net使用Npoi導(dǎo)入導(dǎo)出Excel的方法
這篇文章主要介紹了Asp.Net使用Npoi導(dǎo)入導(dǎo)出Excel的方法,采用該方法在導(dǎo)出Excel的時(shí)候不需要office組件的支持,而在導(dǎo)入Excel的時(shí)候采用OleDb的方式,需要office組件的支持。是一個(gè)非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09
asp.net fileupload控件上傳圖片并預(yù)覽圖片
這篇文章主要介紹了asp.net fileupload控件上傳圖片后并進(jìn)行預(yù)覽圖片的功能,需要的朋友可以參考下2015-11-11
Asp.net 文件上傳類(lèi)(取得文件后綴名,保存文件,加入文字水印)
Asp.net 取得文件后綴名,保存文件,加入文字水印的代碼類(lèi)2008-11-11
Web.config 和 App.config 的區(qū)別分析
Web.config 和 App.config 的區(qū)別分析,需要的朋友可以參考一下2013-05-05
基于.net4.0實(shí)現(xiàn)IdentityServer4客戶(hù)端JWT解密
這篇文章主要為大家詳細(xì)介紹了基于.net4.0實(shí)現(xiàn)IdentityServer4客戶(hù)端JWT解密,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
.NET中彈性和瞬時(shí)處理庫(kù)Polly的使用詳解
Polly 是一個(gè) .NET 彈性和瞬態(tài)故障處理庫(kù),允許開(kāi)發(fā)人員以 Fluent 和線(xiàn)程安全的方式來(lái)實(shí)現(xiàn)重試、斷路、超時(shí)、隔離和回退策略,下面就跟隨小編一起來(lái)看看它的具體使用吧2024-01-01

