我的编程空间,编程开发者的网络收藏夹
学习永远不晚

.NET实现API版本控制

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

.NET实现API版本控制

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

.NET如何实现API版本控制

今天小编给大家分享一下.NET如何实现API版本控制的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 优点有助于保护原有系
2023-07-02

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

前言一般来说需要更改我们API的时候才考虑版本控制,但是我觉得我们不应该等到那时候来实现它,我们应该有一个版本策略从我们应用程序开发时就开始制定好我们的策略,我们一直遵循着这个策略进行开发。 我们其实可以通过多种方式进行实现我们API版本的
2022-06-07

如何自定义node版本,实现node多版本控制方式

这篇文章主要介绍了如何自定义node版本,实现node多版本控制方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-16

mysql的MVCC多版本并发控制的实现

1 什么是MVCC MVCC全称是: Multiversion concurrency control,多版本并发控制,提供并发访问数据库时,对事务内读取的到的内存做处理,用来避免写操作堵塞读操作的并发问题。举个例子,程序员A正在读数据库中
2022-05-31

控制Go包版本

来到编程网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《控制Go包版本》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!问题内容我正在寻找一种方法来控制 github 上的 go
控制Go包版本
2024-04-05

如何在PostgreSQL中实现多版本并发控制

在PostgreSQL中,多版本并发控制是通过使用MVCC(Multi-Version Concurrency Control)机制来实现的。MVCC使每个事务都能够访问数据库中的一个独立版本,并且可以避免数据丢失或不一致的情况。要实现多
如何在PostgreSQL中实现多版本并发控制
2024-04-09

git版本怎么控制

随着软件开发的复杂度不断增加,版本控制变得越来越重要。Git是一个流行的分布式版本控制系统,可以有效地跟踪代码的变化和协同开发。在这篇文章中,我们将探讨Git版本控制的基础知识和一些最佳实践。Git基础知识Git的核心是一个分布式版本库,包
2023-10-22

.NetCore使用Swagger+API多版本控制的流程是什么

这篇文章主要讲解了“.NetCore使用Swagger+API多版本控制的流程是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NetCore使用Swagger+API多版本控制的流程是
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录