您好,登錄后才能下訂單哦!
今天小編給大家分享一下.NET如何實現API版本控制的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
有助于保護原有系統,不受影響,并及時修改問題
可以實現用戶的私人定制(比如是付費接口)
快速迭代
在URL中追加版本或者作為查詢字符串參數
通過自動以標頭和通過接受標頭
ASP.NET API versioning為您提供了一種功能強大但易于使用的方法,用于將API版本控制語義添加到使用ASP.NET構建的新的和現有的REST服務中。API版本控制擴展定義了簡單的元數據屬性和約定,用于描述您的服務實現了哪些API版本。
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="4.2.0" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="4.2.0" />
[ApiVersion("1.1")] //設置版本號 [ApiVersionNeutral]//退出版本控制 [MapToApiVersion("1.1")] //設置獨立版本 [ApiVersion("1.0", Deprecated = true)]//api版本已經被棄用 HttpContext.GetRequestedApiVersion().ToString(); //訪問版本信息
//Versioning用來實現API的版本控制 services.AddApiVersioning(options => { options.DefaultApiVersion = new ApiVersion(1, 1);//默認版本號 options.AssumeDefaultVersionWhenUnspecified = true;//此選項將用于不提供版本的請求,默認情況下假定API的版本為1.0 options.ReportApiVersions = true;//當設置為true時候,api將返回響應標頭中支持的版本信息 //下面這句默認不寫也可以 //options.ApiVersionReader = new QueryStringApiVersionReader(parameterNames: "api-version");//該名稱用于查詢時候使用 });
namespace NetCore_SwaggerVersion.Controllers.v1 { /// <summary> /// 版本1.1 /// </summary> [Route("api/[controller]")] [ApiController] [ApiVersion("1.1")]//可以設置多個 [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
不同命名空間下可以存在相同的控制器
[MapToApiVersion("1.1")] [HttpGet] public IEnumerable<string> Get()
[ApiVersionNeutral]//退出版本控制 [ApiController] [Route("api/[controller]/[action]")] public class WeatherForecastController : ControllerBase
http://localhost:5000/api/WeatherForecast/Get //不寫版本號的話走的是默認的版本號 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
//Versioning用來實現API的版本控制 services.AddApiVersioning(options => { options.DefaultApiVersion = new ApiVersion(1, 1);//默認版本號 options.AssumeDefaultVersionWhenUnspecified = true;//此選項將用于不提供版本的請求,默認情況下假定API的版本為1.0 options.ReportApiVersions = true;//當設置為true時候,api將返回響應標頭中支持的版本信息 });
namespace NetCore_SwaggerVersion.Controllers.v1 { /// <summary> /// 版本1.1 /// </summary> [Route("api/v{version:apiVersion}/[controller]")] [ApiController] [ApiVersion("1.0")] [ApiVersion("1.1")]//定義控制器提供哪個版本的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
不同命名空間下可以存在相同的控制器
[MapToApiVersion("1.1")] [HttpGet] public IEnumerable<string> Get()
[ApiVersionNeutral]//退出版本控制 [ApiController] [Route("api/[controller]/[action]")] public class WeatherForecastController : ControllerBase
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 不受版本控制
//Versioning用來實現API的版本控制 services.AddApiVersioning(options => { options.DefaultApiVersion = new ApiVersion(1, 1);//默認版本號 options.AssumeDefaultVersionWhenUnspecified = true;//此選項將用于不提供版本的請求,默認情況下假定API的版本為1.0 options.ReportApiVersions = true;//當設置為true時候,api將返回響應標頭中支持的版本信息 //header傳遞版本信息 options.ApiVersionReader = new HeaderApiVersionReader("version"); options.ApiVersionSelector = new CurrentImplementationApiVersionSelector(options);//如果沒有傳輸版本號,那么會使用最大版本號 LowestImplementedApiVersionSelector是最小版本號 options.UseApiBehavior = false;//是否使用API行為 });
namespace NetCore_SwaggerVersion.Controllers.v1 { /// <summary> /// 版本1.1 /// </summary> [Route("api/[controller]")] [ApiController] [ApiVersion("1.1")]//定義控制器提供哪個版本的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
不同命名空間下可以存在相同的控制器
[MapToApiVersion("1.1")] [HttpGet] public IEnumerable<string> Get()
[ApiVersionNeutral]//退出版本控制 [ApiController] [Route("api/[controller]/[action]")] public class WeatherForecastController : ControllerBase
http://localhost:5000/api/Test //需要在headers里面增加 version: 1.1 http://localhost:5000/api/WeatherForecast/Get 不受版本控制
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")); //或者 //同時支持查詢字符串和標頭 o.ApiVersionReader = new QueryStringOrHeaderApiVersionReader(parameterName: "version"){HeaderNames = { "api-version", "x-ms-version" }} });
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中版本號部分 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 }; } } }
調試代碼發現這種方式只在程序第一次運行的時候會執行,之后不會再執行多次,因此效率很高。
以上就是“.NET如何實現API版本控制”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。