本文由 千趣源码 – qianqu 发布,转载请注明出处,如有问题请联系我们!.NET之API版本控制
.NET之api版本控制
1. 优势
有利于维护原来系统软件,不受影响,并立即改动难题
能够 完成客户的私人订制(例如是付钱插口)
快速迭代
2. API版本控制
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 : ControllerBase2.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 : ControllerBase2.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 : ControllerBase2.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 }; } } }
调节编码发觉这类方法只在程序流程第一次运作的情况下会实行,以后不容易再实行数次,因而高效率很高。







