.NET实现API版本控制

目录
  • 1. 优点
  • 2. API版本控制
    • 2.1 安装组件
      • 2.1.1 常用配置
    • 2.2 QueryString来实现版本控制
      • 2.2.1 ConfigureServices中配置
      • 2.2.2 控制器设置版本
      • 2.2.3 特定方法设置版本
      • 2.2.4 设置不受版本控制
      • 2.3.5 访问地址
    • 2.3 URL Path Segment来实现版本控制
      • 2.3.1 ConfigureServices中配置
      • 2.3.2 控制器设置版本
      • 2.3.3 特定方法设置版本
      • 2.3.4 设置不受版本控制
      • 2.3.5 访问地址
    • 2.4 HTTP Headers来实现版本控制
      • 2.4.1 ConfigureServices中配置
      • 2.4.2 控制器设置版本
      • 2.4.3 特定方法设置版本
      • 2.4.4 设置不受版本控制
      • 2.4.5 访问地址
    • 2.5 同时支持多种模式
    • 2.6 不借助包,封装文件

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
                };
            }
        }
    }

调试代码发现这种方式只在程序第一次运行的时候会执行,之后不会再执行多次,因此效率很高。

到此这篇关于.NET实现API版本控制的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • .Net Core Api 使用版本控制详解

    Api的版本控制是Api开发中经常遇到的问题, 在大部分中大型项目都需要使用到Api的版本控制 在本篇博客中,我们将说明一下如何在.Net Core Api项目中使用Api版本控制. 本篇博客中测试项目的开发环境: Visual Studio 2017 .Net Core 2.1 SDK 1,安装Microsoft.AspNetCore.Mvc.Versioning NET Core Mvc中,微软官方提供了一个可用的Api版本控制库Microsoft.AspNetCore.Mvc.Versio

  • ASP.NET Core WebApi版本控制的实现

    前言: 在日常项目开发中,随着项目需求不断的累加.不断的迭代:项目服务接口需要向下兼容历史版本:前些时候就因为Api接口为做版本管理导致接口对低版本兼容处理不友好. 最近就像了解下如何实现WebApi版本控制,那么版本控制有什么好处呢? WebApi版本控制的好处 有助于及时推出功能, 而不会破坏现有系统,兼容性处理更友好. 它还可以帮助为选定的客户提供额外的功能. 接下来就来实现版本控制以及在Swagger UI中接入WebApi版本 一.WebApi版本控制实现 通过Microsoft.As

  • ASP.NET Core3.x API版本控制的实现

    前言 一般来说需要更改我们API的时候才考虑版本控制,但是我觉得我们不应该等到那时候来实现它,我们应该有一个版本策略从我们应用程序开发时就开始制定好我们的策略,我们一直遵循着这个策略进行开发. 我们其实可以通过多种方式进行实现我们API版本的控制,其实对于版本控制没有最好的方式,这完全取决于我们面向的使用者. API版本控制类型 安装版本控制包 Install-Package Microsoft.AspNetCore.Mvc.Versioning 在Startup.cs中的ConfigureSe

  • .NET 6开发TodoList应用之实现API版本控制

    目录 需求 目标 原理与思路 实现 添加Nuget Package并配置服务 实现API版本控制 一点扩展 总结 需求 API接口版本管理,对于一些规模稍大的企业应用来说,是经常需要关注的一大需求.尽管我们的示例程序TodoList很简单,但是我们也可以通过这个应用程序,来实践一下如何管理API接口版本. 目标 实现API接口版本管理. 原理与思路 要实现API版本管理,我们需要这个库:Microsoft.AspNetCore.Mvc.Versioning.它提供了.NET Web项目接口的版本

  • 深入讲解.Net Core中的Api版本控制

    前言 .NET Core 是指 .NET Core 运行时和 .NET Core SDK,它包含开发应用程序所需的工具. .NET Core SDK 可与任何以前版本的 .NET Core 运行时一起使用. 本文主要介绍了关于.Net Core Api版本控制的相关内容,下面话不多说了,来一起看看详细的介绍吧 原文链接:API Versioning in .Net Core 作者:Neel Bhatt 简介 Api的版本控制是Api开发中经常遇到的问题, 在大部分中大型项目都需要使用到Api的版

  • .NET实现API版本控制

    目录 1. 优点 2. API版本控制 2.1 安装组件 2.1.1 常用配置 2.2 QueryString来实现版本控制 2.2.1 ConfigureServices中配置 2.2.2 控制器设置版本 2.2.3 特定方法设置版本 2.2.4 设置不受版本控制 2.3.5 访问地址 2.3 URL Path Segment来实现版本控制 2.3.1 ConfigureServices中配置 2.3.2 控制器设置版本 2.3.3 特定方法设置版本 2.3.4 设置不受版本控制 2.3.5

  • 详解Laravel5.6通过路由进行API版本控制的简单方法

    Laravel版本:5.6 API随着迭代,新版本往往需要继承老版本的功能,并对原有的功能修改和扩展,这时为了兼容各个版本的接口,就需要进行版本控制. 请求版本区分: 在请求的header中附带版本信息,如app-version:1.0.1 laravel这边的获取方法: Request::header('app-version'); 文件路径: 1.0.1版本的UserController,文件路径就是 app/Http/Controllers/Api/v1d0d1/UserControlle

  • 浅谈ASP.Net Core WebApi几种版本控制对比

    一.版本控制的好处: (1)有助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或作为查询字符串参数, (2)通过自定义标头和通过接受标头 在这篇文章中, 让我们来看看如何支持多个版本的 ASP.NET Core Web API. 一.创建asp.net core webapi 项目,引用NuGet包:Install-Package Microsoft.AspNetCore

  • SpringBoot2.1 RESTful API项目脚手架(种子)项目

    最近在做一个大型的J2EE项目,后端语言选择了Java,理所当然的选择了Spring,使用Spring MVC来做restful风格的api开发很是方便,Spring下面有很多子项目通过Springboot集成也很舒服.程序员都知道沟通很重要,实际项目中,往往是各自为战,尽管使用的是相同的框架.工具,编写的代码却千差万别,为了统一基础代码风格,编写了这个项目种子. 除此之外,在开发一个Web后端api项目时,通常都会经历搭建项目.选择依赖管理工具.引入基础包依赖.配置框架等,为了加快项目的开发进

  • SpringBoot实现API接口的完整代码

    一.简介 产品迭代过程中,同一个接口可能同时存在多个版本,不同版本的接口URL.参数相同,可能就是内部逻辑不同.尤其是在同一接口需要同时支持旧版本和新版本的情况下,比如APP发布新版本了,有的用户可能不选择升级,这是后接口的版本管理就十分必要了,根据APP的版本就可以提供不同版本的接口. 二.代码实现 本文的代码实现基于SpringBoot 2.3.4-release 1.定义注解 ApiVersion @Target({ElementType.TYPE, ElementType.METHOD}

  • SpringBoot实现API接口多版本支持的示例代码

    一.简介 产品迭代过程中,同一个接口可能同时存在多个版本,不同版本的接口URL.参数相同,可能就是内部逻辑不同.尤其是在同一接口需要同时支持旧版本和新版本的情况下,比如APP发布新版本了,有的用户可能不选择升级,这是后接口的版本管理就十分必要了,根据APP的版本就可以提供不同版本的接口. 二.代码实现 本文的代码实现基于SpringBoot 2.3.4-release 1.定义注解 ApiVersion @Target({ElementType.TYPE, ElementType.METHOD}

随机推荐