摘要
.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