.NET實(shí)現(xiàn)API版本控制
1. 優(yōu)點(diǎn)
- 有助于保護(hù)原有系統(tǒng),不受影響,并及時(shí)修改問(wèn)題
- 可以實(shí)現(xiàn)用戶的私人定制(比如是付費(fèi)接口)
- 快速迭代
2. API版本控制
- 在URL中追加版本或者作為查詢字符串參數(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(); //訪問(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)不寫也可以 //options.ApiVersionReader = new QueryStringApiVersionReader(parameterNames: "api-version");//該名稱用于查詢時(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 : ControllerBase
2.3.5 訪問(wèn)地址
http://localhost:5000/api/WeatherForecast/Get //不寫版本號(hào)的話走的是默認(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 : ControllerBase
2.3.5 訪問(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 : ControllerBase
2.4.5 訪問(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í)支持查詢字符串和標(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)文章
DataGridView使用BindingNavigator實(shí)現(xiàn)簡(jiǎn)單分頁(yè)功能
這篇文章主要介紹了DataGridView使用BindingNavigator實(shí)現(xiàn)簡(jiǎn)單分頁(yè)功能,本文主要是通過(guò)借用BindingNavigator空殼,文中通過(guò)實(shí)例代碼講解的非常詳細(xì),需要的朋友可以參考下2019-11-11ABP引入SqlSugar框架的簡(jiǎn)單版創(chuàng)建使用
這篇文章主要為大家介紹了ABP引入SqlSugar框架的簡(jiǎn)單版創(chuàng)建使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04Asp.net 時(shí)間操作基類(支持短日期,長(zhǎng)日期,時(shí)間差)
支持短日期,長(zhǎng)日期,時(shí)間差的操作基類,方便大家直接使用2008-11-11.net 中的SqlConnection連接池機(jī)制詳解
.net 中通過(guò) SqlConnection 連接 sql server,我們會(huì)發(fā)現(xiàn)第一次連接時(shí)總是很耗時(shí),但后面連接就很快,這個(gè)其實(shí)和SqlConnection 的連接池機(jī)制有關(guān)2013-04-04.NET 中英文混合驗(yàn)證碼實(shí)現(xiàn)代碼
.NET 中英文混合驗(yàn)證碼實(shí)現(xiàn)代碼2009-11-11asp.net(C#) 生成隨機(jī)驗(yàn)證碼的代碼
asp.net(C#) 生成隨機(jī)驗(yàn)證碼的代碼...2007-04-04