文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

.NET如何实现API版本控制

2023-07-02 15:49

关注

今天小编给大家分享一下.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 : ControllerBase
2.3.5 访问地址
http://localhost:5000/api/WeatherForecast/Get //不写版本号的话走的是默认的版本号http://localhost:5000/api/Test?api-version=1.1http://localhost:5000/api/Test?api-version=1.2http://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/Testhttp://localhost:5000/api/v1.1/Testhttp://localhost:5000/api/v2.6/Testhttp://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.1http://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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯