摘要
.NET的API版本控制有很多优势,比如可以维护原系统软件,不受影响,还能快速满足客户需求。可以在URL中增加版本号或作为查看参数,使用ASP.NET API versioning部件实现。
正文
.NET之API版本控制
1. 优势
-
有利于维护原来系统软件,不受影响,并立即改动难题
-
能够 完成客户的私人订制(例如是付钱插口)
-
快速迭代
2. API版本控制
-
在URL中增加版本号或是做为查看字符串数组主要参数
-
根据全自动以标题文字和根据接纳标题文字
2.1 安裝部件
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" />
2.1.1 常见配备
[ApiVersion("1.1")] //设定版本信息 [ApiVersionNeutral]//撤出版本控制 [MapToApiVersion("1.1")] //设定单独版本号 [ApiVersion("1.0", Deprecated = true)]//api版本号早已被弃用 HttpContext.GetRequestedApiVersion().ToString(); //浏览版本信息
2.2 QueryString来完成版本控制
2.2.1 ConfigureServices中配备
//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");//该名字用以查看情况下应用 });
2.2.2 控制板设定版本号
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
不一样类名下能够 存有同样的控制板
2.2.3 特殊方式 设定版本号
[MapToApiVersion("1.1")] [HttpGet] public IEnumerable<string> Get()
2.2.4 设定不会受到版本控制
[ApiVersionNeutral]//撤出版本控制 [ApiController] [Route("api/[controller]/[action]")] public class WeatherForecastController : ControllerBase
2.3.5 浏览详细地址
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
2.3 URL Path Segment来完成版本控制
2.3.1 ConfigureServices中配备
//Versioning用于完成API的版本控制 services.AddApiVersioning(options => { options.DefaultApiVersion = new ApiVersion(1, 1);//默认设置版本信息 options.AssumeDefaultVersionWhenUnspecified = true;//此选择项将用以不给予版本号的要求,默认设置状况下假设API的版本号为1.0 options.ReportApiVersions = true;//当设定为true情况下,api将回到回应标题文字中适用的版本信息 });
2.3.2 控制板设定版本号
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
不一样类名下能够 存有同样的控制板
2.3.3 特殊方式 设定版本号
[MapToApiVersion("1.1")] [HttpGet] public IEnumerable<string> Get()
2.3.4 设定不会受到版本控制
[ApiVersionNeutral]//撤出版本控制 [ApiController] [Route("api/[controller]/[action]")] public class WeatherForecastController : ControllerBase
2.3.5 浏览详细地址
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来完成版本控制
2.4.1 ConfigureServices中配备
//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个人行为 });
2.4.2 控制板设定版本号
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
不一样类名下能够 存有同样的控制板
2.4.3 特殊方式 设定版本号
[MapToApiVersion("1.1")] [HttpGet] public IEnumerable<string> Get()
2.4.4 设定不会受到版本控制
[ApiVersionNeutral]//撤出版本控制 [ApiController] [Route("api/[controller]/[action]")] public class WeatherForecastController : ControllerBase
2.4.5 浏览详细地址
http://localhost:5000/api/Test //必须在headers里边提升 version: 1.1 http://localhost:5000/api/WeatherForecast/Get 不会受到版本控制
2.5 另外适用多种多样方式
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" }} });
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中版本信息一部分 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 }; } } }
调节编码发觉这类方法只在程序流程第一次运作的情况下会实行,以后不容易再实行数次,因而高效率很高。
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
温馨提示:如果您访问和下载本站资源,表示您已同意只将下载文件用于研究、学习而非其他用途。
评论0