ASP.NET Core3.x API版本控制的实现
一般来说需要更改我们API的时候才考虑版本控制,但是我觉得我们不应该等到那时候来实现它,我们应该有一个版本策略从我们应用程序开发时就开始制定好我们的策略,我们一直遵循着这个策略进行开发。
我们其实可以通过多种方式进行实现我们API版本的控制,其实对于版本控制没有最好的方式,这完全取决于我们面向的使用者。
API版本控制类型
安装版本控制包
1
Install-Package Microsoft.AspNetCore.Mvc.Versioning
在Startup.cs中的ConfigureServices方法中进行版本设置,以及在控制器通过特性进行设置版本,这样可以实现版本控制。
1
2
3
4
5
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版本约束方式
字符串参数形式
1
2
services.AddApiVersioning(options =>
options.ApiVersionReader = new QueryStringApiVersionReader("v"));
HTTP请求头
1
2
services.AddApiVersioning(options =>
options.ApiVersionReader = new HeaderApiVersionReader("api-version"));
组合方式
1
2
3
4
services.AddApiVersioning(options => {
options.ApiVersionReader = ApiVersionReader.Combine(
new QueryStringApiVersionReader("v"),
new HeaderApiVersionReader("v"));});
URL方式
1
2
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路径则可以参考如下代码片段:
1
[Route("api/v{version:apiVersion}/[controller]")]
API控制器弃用,我们只需要设置
1
[ApiVersion("1.0", Deprecated = true)]
可通过如下方法方式获取所有API版本信息
1
var apiVersion = HttpContext.GetRequestedApiVersion();
当然他还支持模型绑定,我们还可以通过模型形式获取
1
2
3
[HttpGet]
public string Get(ApiVersion apiVersion) => $"Controller = {GetType().Name}\nVersion = {apiVersion}";
}
API版本约束
我们除了在方法和控制器上指定我们的版本,我们还可以采用另一种方式
1
2
3
4
services.AddApiVersioning( options =>
{
options.Conventions.Controller<HomeController>().HasApiVersion(1, 0);
});
看如上代码我们可以看到我们在这里给HomeController配置版本,这样方便我们集中管理我们的版本。
1
2
3
4
5
6
7
8
9
10
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用于此目的的接口。
1
options.Conventions.Add(new MyCustomConvention());
当然我们还可以通过不同命名空间中的接口进行约束
1
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 Core3.x API版本控制的实现的文章就介绍到这了,更多相关ASP.NET Core3.x API版本控制内容请搜索聚合云库文库以前的文章或继续浏览下面的相关文章希望大家以后多多支持聚合云库文库!
原文链接:https://www.cnblogs.com/yyfh/p/13033543.html
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/jiaob/net/7912.shtml
相关文章
热门TAG
命令 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 技巧 权重 服务器 网站流量 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows 蜘蛛 搜索引擎 网站收录 JSP 实例解析最新文章
-
如何给asp.net core写个中间
时间:2021-01-03
-
.Net微信网页开发解决用户
时间:2021-01-03
-
c++中Socket通信函数之WSAS
时间:2020-12-29
-
提高生产性工具
时间:2020-12-29
-
全新的membership框架Asp.ne
时间:2020-12-29
-
不用找了,比较全的signal
时间:2020-12-29
-
计算字符串中每种字符出
时间:2020-12-29
-
EntityFramework 5.0 CodeFirst 教
时间:2020-12-29
热门文章
-
.NET 开发环境搭建图文详解
时间:2020-12-27
-
Windows下Visual Studio 2017安装配置方法图文教
时间:2020-12-23
-
.Net微信网页开发解决用户在不同公众号或
时间:2021-01-03
-
oracle 11g rac安装之grid报错解决
时间:2020-12-28
-
ASP.NET Core 3.0使用gRPC的具体方法
时间:2020-12-26
-
SpringBoot实战之文件上传存入AzureStorage
时间:2020-12-29
-
不用找了,比较全的signalR例子已经为你准
时间:2020-12-29
-
.NET Core3.1编写混合C++程序
时间:2020-12-26
-
Oracle的卸载
时间:2020-12-28
-
计算字符串中每种字符出现的次数[Dicti
时间:2020-12-29
