前言

一般来说需要更改我们API的时候才考虑版本控制,但是我觉得我们不应该等到那时候来实现它,我们应该有一个版本策略从我们应用程序开发时就开始制定好我们的策略,我们一直遵循着这个策略进行开发。

我们其实可以通过多种方式进行实现我们API版本的控制,其实对于版本控制没有最好的方式,这完全取决于我们面向的使用者。

API版本控制类型

安装版本控制包

Install-Package Microsoft.AspNetCore.Mvc.Versioning

在Startup.cs中的ConfigureServices方法中进行版本设置,以及在控制器通过特性进行设置版本,这样可以实现版本控制。

services.AddApiVersioning(options => {
options.DefaultApiVersion = new ApiVersion(1, 0);
options.AssumeDefaultVersionWhenUnspecified = true;
options.ReportApiVersions = true;
});
  • options.DefaultApiVersion = new ApiVersion(1,0): 这个设置不是必须的,因为默认情况下给我们设置的是1.0,但是显式的声明出来是一个很好的习惯,当然DefaultApiVersion它会将默认的[ApiVersion("1.0")]添加到控制器上,也就是说它会隐式的绑定API版本,但是为了我们方便理解或者说方便我们后面开发建议显式的设置。
  • options.AssumeDefaultVersionWhenUnspecified = true:默认API版本控制需要将其属性设置为true才可以开启
  • options.ReportApiVersions = true:默认情况下它是禁用的,启用此选项后,来自我们API端点的响应将带有标头,告诉我们的客户端支持或不推荐使用哪个版本(api-supported-versions: 1.1, 2.0, api-deprecated-versions: 1.0)

默认提供了四种版本控制方法:

  • 字符串参数
  • 通过HTTP请求头
  • URL方式
  • 媒体类型(Media Type)

默认方法是使用名为api-version 的查询字符串参数。我们还可以自己定义一个版本控制规则。

API版本约束方式

  • 字符串参数形式
services.AddApiVersioning(options =>
options.ApiVersionReader = new QueryStringApiVersionReader("v"));
  • HTTP请求头
services.AddApiVersioning(options =>
options.ApiVersionReader = new HeaderApiVersionReader("api-version"));
  • 组合方式
services.AddApiVersioning(options => {
options.ApiVersionReader = ApiVersionReader.Combine(
new QueryStringApiVersionReader("v"),
new HeaderApiVersionReader("v"));});
  • URL方式
services.AddApiVersioning(options => options.ApiVersionReader =
new UrlSegmentApiVersionReader());

我们可以更改代表版本的参数名称(例如,在上面的查询字符串方法中,我们使用字母v代替默认的api-version)。

控制器和方法中添加版本信息

选择版本控制策略并在ConfigureServices方法中对其配置后,我们可以开始对API端点进行版本控制,我们可以将这些属性应用于控制器和方法。

  • 控制器的默认可能没有任何API版本属性,并隐式配置的默认API版本。默认配置使用值1.0。
  • 使用[ApiVersion("1.0")]属性注释我们的控制器,意味着该控制器支持API版本1.0
  • 控制器可以支持多个API版本。只需[ApiVersion(...)]在控制器上应用多个属性
  • 为了区分控制器支持的多个版本,我们使用[MapToApiVersion()]属性注释控制器方法。

如果要使用URL路径则可以参考如下代码片段:

[Route("api/v{version:apiVersion}/[controller]")]

API控制器弃用,我们只需要设置

[ApiVersion("1.0", Deprecated = true)]

可通过如下方法方式获取所有API版本信息

var apiVersion = HttpContext.GetRequestedApiVersion();

当然他还支持模型绑定,我们还可以通过模型形式获取

  [HttpGet]
public string Get(ApiVersion apiVersion) => $"Controller = {GetType().Name}\nVersion = {apiVersion}";
}

API版本约束

我们除了在方法和控制器上指定我们的版本,我们还可以采用另一种方式

services.AddApiVersioning( options =>
{
options.Conventions.Controller<HomeController>().HasApiVersion(1, 0);
});

看如上代码我们可以看到我们在这里给HomeController配置版本,这样方便我们集中管理我们的版本。

services.AddApiVersioning( options =>
{
options.Conventions.Controller<MyController>()
.HasDeprecatedApiVersion(1, 0)
.HasApiVersion(1, 1)
.HasApiVersion(2, 0)
.Action(c => c.Get1_0()).MapToApiVersion(1, 0)
.Action(c => c.Get1_1()).MapToApiVersion(1, 1)
.Action(c => c.Get2_0()).MapToApiVersion(2, 0);
});

可以同时使用API版本约束和版本控制属性。

当然我们还可以自定义约束,从.NET Core 3.0开始,有一个IControllerConvention用于此目的的接口。

options.Conventions.Add(new MyCustomConvention());

当然我们还可以通过不同命名空间中的接口进行约束

options.Conventions.Add(new VersionByNamespaceConvention());

比如下面这种文件形式

api/v1/UsersController
api/v2/UsersController
api/v2_1/UsersController

映射后的路径如下所示

api/1.0/users
api/2.0/users
api/2.1/users

ASP.NET Core 3.x API版本控制的更多相关文章

  1. .Net Core中的Api版本控制

    原文链接:API Versioning in .Net Core 作者:Neel Bhatt 简介 Api的版本控制是Api开发中经常遇到的问题, 在大部分中大型项目都需要使用到Api的版本控制 在本 ...

  2. 【转】.Net Core中的Api版本控制

    原文链接:API Versioning in .Net Core 作者:Neel Bhatt 简介 Api的版本控制是Api开发中经常遇到的问题, 在大部分中大型项目都需要使用到Api的版本控制 在本 ...

  3. ASP.NET Core WebApi构建API接口服务实战演练

    一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...

  4. 温故知新,使用ASP.NET Core创建Web API,永远第一次

    ASP.NET Core简介 ASP.NET Core是一个跨平台的高性能开源框架,用于生成启用云且连接Internet的新式应用. 使用ASP.NET Core,您可以: 生成Web应用和服务.物联 ...

  5. angular4和asp.net core 2 web api

    angular4和asp.net core 2 web api 这是一篇学习笔记. angular 5 正式版都快出了, 不过主要是性能升级. 我认为angular 4还是很适合企业的, 就像.net ...

  6. ASP.NET Core 中基于 API Key 对私有 Web API 进行保护

    这两天遇到一个应用场景,需要对内网调用的部分 web api 进行安全保护,只允许请求头账户包含指定 key 的客户端进行调用.在网上找到一篇英文博文 ASP.NET Core - Protect y ...

  7. 使用ASP.NET Core构建RESTful API的技术指南

    译者荐语:利用周末的时间,本人拜读了长沙.NET技术社区翻译的技术标准<微软RESTFul API指南>,打算按照步骤写一个完整的教程,后来无意中看到了这篇文章,与我要写的主题有不少相似之 ...

  8. Asp.Net Core 5 REST API - Step by Step

    翻译自 Mohamad Lawand 2021年1月19日的文章 <Asp.Net Core 5 Rest API Step by Step> [1] 在本文中,我们将创建一个简单的 As ...

  9. Asp.Net Core 5 REST API 使用 JWT 身份验证 - Step by Step

    翻译自 Mohamad Lawand 2021年1月22日的文章 <Asp Net Core 5 Rest API Authentication with JWT Step by Step> ...

随机推荐

  1. spring 事务管理配置

    本篇文章只涉及spring事务的配置,不进行事务的介绍. spring通过PlatformTransactionManager接口作为事务管理器来进行事务的管理,它本身并不进行事务的创建以及相关操作, ...

  2. git&&SourceTree使用总结

    git&&sourceTree操作学习 基本操作 commit 提交 pull 更新代码 push 推送代码 fetch 抓取代码 Branch 新建分支 merge 合并代码 Sta ...

  3. Java抽象类的学习体会与注意事项

    一.定义 抽象类:用abstract声明的class为抽象类. 抽象方法:用abstract声明的方法为抽象方法. 抽象方法特点:只有方法定义,没有方法的实现(函数体) 抽象类的子类都必须实现它的方法 ...

  4. idea 2020 配置本地 Maven 仓库

    问题: 默认Maven 仓库地址在C盘,C盘是系统盘能少放东西尽量少放. 只需要简单的两步 1.File~Settings 然后搜索 maven 如下图绿框 修改成你自己的 Maven 仓库 2.Fi ...

  5. python语法学习第十天--类与对象

    python面向对象语言 对象=属性+方法 OO(Object oriented面向对象)的特征: ①封装,信息隐蔽技术②继承:class A(BaseClass):③多态   类:图纸 class ...

  6. threading模块—Python多线程编程

    Threading 模块 threading 模块除了提供基本的线程和锁定支持外,还提供了更高级别.功能更全面的线程管理.threading 模块支持守护线程,其工作方式是:守护线程一般是一个等待客户 ...

  7. 初识spring boot maven管理--HelloWorld

    配置文件配置好 了之后可以进行第一个例子的编写了! @Controller @EnableAutoConfiguration() public class SampleController { pri ...

  8. 【SMB源码解析系列】——003.SMB游戏基本框架

    前面有了解到RESET中断相关代码,结尾处通过一句jmp进入了无限循环,之后CPU将会在每一帧PUU进入VBlank状态时,接收NMI中断信号, 跳转至NMI代码处继续执行,直到遇见RTI指令时又返回 ...

  9. 9、AutoResponder返回本地数据(mock)

    前言 mock可以说是面试必问的话题的,我第一次接触mock的时候也是一脸懵逼.虽然fiddler工具用了很久,里面的打断点,设置自动返回数据功能都用过.mock说的通俗一点就是模拟返回数据,只是面试 ...

  10. js性能优化之---防抖函数

    使用场景 input的时时触发搜索功能 scroll事件的滚动条位置的监测 resize事件监听窗口变化等 举个栗子(input框时时触发搜索功能) 普通未防抖款 var textElement = ...