.NET之API版本控制

1. 优势

  1. 有利于维护原来系统软件,不受影响,并立即改动难题

  2. 能够 完成客户的私人订制(例如是付钱插口)

  3. 快速迭代

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条)

刀客源码 游客评论