Web API 的版本化可以尽量保证在相同url情况下保留一个 api 的多个版本,通常一个 webapi 会有多个client,这些client包括:app,web,html5,crawl 等等同构或者异构的平台,当 api 升级之后,往往升级前的 api 也得保留,当维护两个api的时候就是一个不小的挑战,毕竟还是存在一些 client 用户需要访问老的api,这时候就需要将 webapi 版本化。

安装 Versioning 包

要想使用 webapi 的版本化功能,需要用 nuget 引用 Microsoft.AspNetCore.Mvc.Versioning 包,还可以通过 Visual Studio 2019 的 NuGet package manager 可视化界面安装 或者 通过 NuGet package manager 命令行工具输入以下命令:

dotnet add package Microsoft.AspNetCore.Mvc.Versioning

启动 API 版本化

当包成功添加到项目之后,接下来就可以在 Startup.ConfigureServices 中将 ApiVersioning 注入到容器中,如下代码所示:

    public class Startup{public void ConfigureServices(IServiceCollection services){services.AddControllers();services.AddApiVersioning();}}

在调用 AddApiVersioning() 的时候记得 using Microsoft.AspNetCore.Mvc.Versioning,除了这个默认方法,还可以做一些全局配置,如下代码所示:

    public class Startup{public void ConfigureServices(IServiceCollection services){services.AddControllers();services.AddApiVersioning(v =>{v.ReportApiVersions = true;v.AssumeDefaultVersionWhenUnspecified = true;v.DefaultApiVersion = new ApiVersion(1, 0);});}}

使用 QueryString 指定版本号

先来看一下代码,考虑如下的 api。

    [ApiController][ApiVersion("2.0")][Route("api/[controller]")]public class WeatherForecastController : ControllerBase{private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};[HttpGet]public IEnumerable<WeatherForecast> Get(){var rng = new Random();return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = rng.Next(-20, 55),Summary = Summaries[rng.Next(Summaries.Length)]}).ToArray();}}

从代码中可以看到,我在 WeatherForecastController 上标记了该 Controller 是 v2.0 版本,接下来如何访问呢?可以通过如下链接: http://localhost:61582/api/weatherforecast?api-version=2.0

看到这里,有些朋友就有疑问了,v2.0 的 Get 是有了,那 v1.0 的 Get 怎么访问呢?实际开发中的做法是这样的,会用两个命名空间来表示相应的版本号,可以看如下代码:

namespace WebApplication6.Controllers.v1
{[ApiController][ApiVersion("1.0")][Route("api/[controller]")]public class WeatherForecastController : ControllerBase{private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};private readonly ILogger<WeatherForecastController> _logger;public WeatherForecastController(ILogger<WeatherForecastController> logger){_logger = logger;}[HttpGet]public IEnumerable<WeatherForecast> Get(){var rng = new Random();return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = rng.Next(-20, 55),Summary = Summaries[rng.Next(Summaries.Length)]}).ToArray();}}
}namespace WebApplication6.Controllers.v2
{[ApiController][ApiVersion("2.0")][Route("api/[controller]")]public class WeatherForecastController : ControllerBase{private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};private readonly ILogger<WeatherForecastController> _logger;public WeatherForecastController(ILogger<WeatherForecastController> logger){_logger = logger;}[HttpGet]public IEnumerable<WeatherForecast> Get(){var rng = new Random();return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = rng.Next(-20, 55),Summary = Summaries[rng.Next(Summaries.Length)]}).ToArray();}}
}

从上面代码可以看到 WebApplication6.Controllers.v1 表示版本 v1.0 , WebApplication6.Controllers.v2 表示版本 v2.0,接下来依次浏览这两个url。

使用 routes 指定版本号

很显然使用 QueryString 的方式不是很优雅也不符合 Restful 规范,接下来看一下如何通过 Route 改造,考虑下面的类,请注意我是如何在 route 中进行版本化的。

    [ApiController][ApiVersion("1.0")][Route("api/v{version:apiVersion}/[controller]")]public class WeatherForecastController : ControllerBase{private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};[HttpGet]public IEnumerable<WeatherForecast> Get(){var rng = new Random();return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = rng.Next(-20, 55),Summary = Summaries[rng.Next(Summaries.Length)]}).ToArray();}}

在这里,我将 [Route("api/[controller]")] 替换成了 [Route("api/v{version:apiVersion}/[controller]")],接下来将项目跑起来,如下图所示:

忽略 API 版本

在 API 版本化时,有些 API 可能只有一个版本的需求,这时候可以使用 ApiVersionNeutral 特性来忽视版本化,如下代码所示:

    [ApiVersionNeutral][Route("api/[controller]")][ApiController]public class WeatherForecastController : ControllerBase{private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};[HttpGet]public IEnumerable<WeatherForecast> Get(){var rng = new Random();return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = rng.Next(-20, 55),Summary = Summaries[rng.Next(Summaries.Length)]}).ToArray();}}

实现 ASP.NET Core WebApi 的版本化相关推荐

  1. ASP.NET Core WebAPI控制器返回类型的最佳选项

    ASP.NET Core WebAPI控制器返回类型的最佳选项 原文:ASP.NET Core WebAPI控制器返回类型的最佳选项 前言 从.NET Core 2.1版开始,到目前为止,控制器操作可 ...

  2. IIS部署asp.net core webapi

    一.需要安装Windows Server Hosting,作用是让IIS有方向代理功能(Asp.Net Core Module负责反向代理工作),将请求转发到Kestrel,Windows serve ...

  3. ASP.Net Core WebApi几种版本控制对比

    ASP.Net Core WebApi几种版本控制对比 原文:ASP.Net Core WebApi几种版本控制对比 一.版本控制的好处: (1)有助于及时推出功能, 而不会破坏现有系统. (2)它还 ...

  4. NET问答: 如何将 ASP.NET Core WebAPI 中抛出的异常封装成对象?

    咨询区 rianjs: 在 ASP.NET Core WebAPI 中,我的 Controller 代码如下: [Route("create-license/{licenseKey}&quo ...

  5. 【源码解读】Vue与ASP.NET Core WebAPI的集成

    在前面博文[Vue]Vue 与 ASP.NET Core WebAPI 的集成中,介绍了集成原理:在中间件管道中注册SPA终端中间件,整个注册过程中,终端中间件会调用node,执行npm start命 ...

  6. 【Vue】Vue与ASP.NET Core WebAPI的集成

    SPA单页面应用已经遍地开花,熟知的三大框架,Angular.Vue和React,其中Angular与React均可集成至ASP.NET Core,且提供了相关了中间件.但是Vue没有: " ...

  7. ASP.NET CORE WEBAPI文件下载

    最近要使用ASP.NET CORE WEBAPI用来下载文件,使用的.NET CORE 3.1.考虑如下场景: 文件是程序生成的. 文件应该能兼容各种格式. 浏览器可以感知进行下载. 准备 经过简单的 ...

  8. Asp.Net Core WebAPI+PostgreSQL部署在Docker中

    PostgreSQL是一个功能强大的开源数据库系统.它支持了大多数的SQL:2008标准的数据类型,包括整型.数值值.布尔型.字节型.字符型.日期型.时间间隔型和时间型,它也支持存储二进制的大对像,包 ...

  9. asp.net core webApi 参数保护

    Intro asp.net core data protection 扩展,基于 IDataProtector 扩展的数据保护组件,自动化的实现某些参数的保护 ParamsProtection Par ...

  10. ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...

最新文章

  1. 使用 Code Snippet 简化 Coding
  2. Gmapping——从原理到实践
  3. Sublime text 2下alignment插件无效的解决办法
  4. 【Python】hashlib模块实现MD5加密
  5. java 把文件转化为字节数组
  6. python中int对象不可调用_'int'对象在python中不可调用
  7. 第14次全天课笔记 20181028 集合、时间、类
  8. bootstrap pagewrapper_BootStrap table服务端分页
  9. java用JDBC连接数据库的方式
  10. 响应式编程在Android 中的一些探索
  11. java 小数 乘法_javascript(js)的小数点乘法除法-Java架构师必看
  12. sqlserver为数据库表增加自增字段
  13. LabVIEW--为控件添加说明信息
  14. LINUX/MAC的rpath,搜索依赖库时从哪里开始
  15. android 生成 kml代码,android 导入KML文件
  16. 用ArrayList实现简单队列和栈
  17. android触屏对焦_Android自定义相机实现自动对焦和手动对焦
  18. nasm做一个简单的操作系统写字本(1)
  19. 如何设计游戏中的道具功能(二)
  20. 如何在office word or ppt 中插入Latex公式

热门文章

  1. 配置JDK、Tomcat环境、DNK环境
  2. Preparing transaction:done Verifying transaction:failed RemoveError:‘requests‘ is a dependency of **
  3. win10系统有些软件有声音,有些软件没有声音
  4. Chives 集群收割机图文说明
  5. 规章制度的处理:既要照章处理,又要考虑特殊情况
  6. Scrapy爬取拉钩网的爬虫(爬取整站CrawlSpider)
  7. 全网通工业无线路由器多网口工业路由器
  8. 阿里性能调优工具Arthas
  9. 【已解决】Remove redundant parentheses等Python错误大全
  10. linux affinity,Linux CPU Affinity