前言

首先希望webapi 支持多版本,swagger针对不同的版本可进行交互。netcore 基于Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer 包,版本控制可以选择Swashbuckle.AspNetCore和nswag.AspNetCore.由于我们系统使用的是nswag所以继续沿用,当然Swashbuckle.AspNetCore也和不错,有时间再总结。

版本控制

1.导入相关nuget。Swashbuckle.AspNetCore

2.添加服务

2.1.首先是让项目支持多版本的服务添加

  services.AddApiVersioning(option =>
{
// 可选,为true时API返回支持的版本信息
option.ReportApiVersions = true;
// 不提供版本时,默认为1.0
option.AssumeDefaultVersionWhenUnspecified = true;
//版本信息放到header ,不写在不配置路由的情况下,版本信息放到response url 中
option.ApiVersionReader = new HeaderApiVersionReader("api-version");
// 请求中未指定版本时默认为1.0
option.DefaultApiVersion = new ApiVersion(1, 0);
}).AddVersionedApiExplorer(option =>
{ // 版本名的格式:v+版本号
option.GroupNameFormat = "'v'V";
option.AssumeDefaultVersionWhenUnspecified = true;
});
////获取webapi版本信息,用于swagger多版本支持
this.provider = services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>();

服务我们已经注入了,下面我们看一下怎么webapi 多版本的支持

2.1.1.多版本的控制

1.QueryString

  /// <summary>
/// 用户管理API
/// </summary>
[ServiceFilter(typeof(LogFilterAttribute))]
[ApiController]
[Route("api/[controller]/[action]")]
[ApiVersion("2.0")] public class UserController : ApiController
{}

当我们注册服务时不加  option.ApiVersionReader = new HeaderApiVersionReader("api-version"); 那么版本信息就是通过url?api-version=2进行传递

2.header

  /// <summary>
/// 用户管理API
/// </summary>
[ServiceFilter(typeof(LogFilterAttribute))]
[ApiController]
[Route("api/[controller]/[action]")]
[ApiVersion("2.0")] public class UserController : ApiController
{}

如果不指定版本路由那么定义ApiVersionReader  则通过header传递

以上两种方式,默认版本(v1.0)均可不传递版本号

3.版本路由

 /// <summary>
/// 用户管理API
/// </summary>
[ServiceFilter(typeof(LogFilterAttribute))]
[ApiController]
[Route("api/v{version:apiVersion}/[controller]/[action]")]
[Authorize]
[ApiVersion("1.0")]
[ApiVersion("2.0")]
public class UserController : ApiController
{}

这种方式很直观,但如果原有项目没有使用多版本控制不建议用,可采用header的方式更为合理一些,

2.1.2 同一个 Controller 支持多版本

增加多个  [ApiVersion("2.0")]即可。

   /// <summary>
/// 用户管理API
/// </summary>
[ServiceFilter(typeof(LogFilterAttribute))]
[ApiController]
[Route("api/v{version:apiVersion}/[controller]/[action]")]
//[Authorize]
[ApiVersion("1.0")]
[ApiVersion("2.0")]
public class UserController : ApiController
{}

但是两个相同的版本中Controller不能有相同的方法。比如v1 文件夹和v2文件的UserController都指向v2版本,是不能同时拥有GetList()的,但是如果我们想要v2中的GetList重写v1的GetList方法,其他的方法都继承过来怎么处理呢?

v1 版本中的controller指定[ApiVersion("1.0")][ApiVersion("2.0")]

/// <summary>
/// v1.用户管理API
/// </summary>
[ServiceFilter(typeof(LogFilterAttribute))]
[ApiController]
[Route("api/v{version:apiVersion}/[controller]/[action]")]
//[Authorize]
[ApiVersion("1.0")]
[ApiVersion("2.0")]
public class UserController : ApiController
{}

v2版本中的controller指定[ApiVersion("2.0")]

    /// <summary>
/// v1.用户管理API
/// </summary>
[ServiceFilter(typeof(LogFilterAttribute))]
[ApiController]
[Route("api/v{version:apiVersion}/[controller]/[action]")]
//[Authorize]
[ApiVersion("2.0")]
public class UserController : ApiController
{}

v1版本中的GetList()方法 MapToApiVersion到v1即可

         /// <summary>
/// 获取用户列表
/// </summary>
/// <returns></returns>
[HttpGet,MapToApiVersion("1.0")]
public NetResponse<List<User>> GetList()
{}

这样以来v1与v2中的GetList 就互不影响了。

3.注册nswag(AddOpenApiDocument和AddSwaggerDocument)

NSwag注入服务有两个方法:AddOpenApiDocument和AddSwaggerDocument,两者的区别就是架构类型不一样,AddOpenApiDocument的SchemaType使用的是OpenApi3,AddSwaggerDocument的SchemaType使用的是Swagger2:

我用的是AddSwaggerDocument

 foreach (var description in provider.ApiVersionDescriptions)
{
services.AddSwaggerDocument(document =>
{
document.OperationProcessors.Add(new OperationSecurityScopeProcessor("JWT token"));
document.DocumentName = description.GroupName;
document.Version = description.GroupName;
document.ApiGroupNames = new string[] { description.GroupName };
//jwt 认证
document.AddSecurity("JWT token", Enumerable.Empty<string>(),
new OpenApiSecurityScheme()
{
Type = OpenApiSecuritySchemeType.ApiKey,
Name = nameof(Authorization),
In = OpenApiSecurityApiKeyLocation.Header,
Description = "将token值复制到如下格式: \nBearer {token}"
}
); });
}

4.nswag中间件

                app.UseOpenApi();
app.UseSwaggerUi3(setting =>
{
});

是的我们做任何配置,如果你愿意其实有很多好玩的。但上面的配置方式足够多版本的控制与nswag交互。

net core webapi多版本控制与nswag 交互的更多相关文章

  1. net core webapi多版本控制与swagger(nswag)配置

    前言 首先希望webapi 支持多版本,swagger针对不同的版本可进行交互.多版本控制基于Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer 包,swa ...

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

    版本控制的好处: (1)助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或 ...

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

    Net Core WebApi几种版本控制对比 一.版本控制的好处: (1)有助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方 ...

  4. 零基础ASP.NET Core WebAPI团队协作开发

    零基础ASP.NET Core WebAPI团队协作开发 相信大家对“前后端分离”和“微服务”这两个词应该是耳熟能详了.网上也有很多介绍这方面的文章,写的都很好.我这里提这个是因为接下来我要分享的内容 ...

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

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

  6. ASP.NET Core WebApi使用Swagger生成api

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

  7. 发布 .Net Core WebAPI 应用程序到 Docker

    目录 1. 创建 .net core webapi 项目 2. 编译应用 3. 创建 Dockerfile 文件 4. 上传文件到服务器 5. 生成Docker Image 6. 在Docker Co ...

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

    原文链接:https://www.cnblogs.com/yilezhu/p/9241261.html 引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必 ...

  9. net core WebApi——文件分片下载

    目录 前言 开始 测试 小结 @ 前言 上一篇net core WebApi--文件分片上传与跨域请求处理介绍完文件的上传操作,本来是打算紧接着写文件下载,中间让形形色色的事给耽误的,今天还是抽个空整 ...

随机推荐

  1. Linux NSF网络共享盘

    服务器安装: yum -y install nfs-utils rpcbind 服务器配置 :vi /etc/exports 例: /root/docs  192.168.1.*(rw,sync,no ...

  2. python_购物车

    流程图  实现方式 #!/usr/bin/python3 __author__ = 'beimenchuixue' __blog__ = 'http://www.cnblogs.com/2bjiuji ...

  3. Ansys Student 2020R2中Fluent编译UDF简介

    使用内建编译器 在Ansys Fluent中编译UDF一般都需要额外安装相应版本的Visual Studio编译器,VS的缺点是体量大,占空间,安装后还需要额外进行相关设置才能正常使用.而新版本的An ...

  4. Archive: ****** End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes

    Archive:  demoApi.zip   End-of-central-directory signature not found.  Either this file is not   a z ...

  5. 十一、模拟扫码登录微信(用Django简单的布置了下页面)发送接收消息

    为了能够模拟登陆QQ,并获取信息.对扫码登录微信进行了分析.简单的用了一下Django将获取的信息映射到页面上.(python3+pycharm) 主要过程就是: 1.获取二维码 2.扫码登录(有三种 ...

  6. 部署docker swarm集群

    基础环境 机器名称 IP地址 安装的软件 node-1 192.168.10.190 docker-ce node-2 192.168.10.191 docker-ce node-3 192.168. ...

  7. .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记

    目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...

  8. spring-boot-route(十四)整合Kafka

    在上一章中SpringBoot整合RabbitMQ,已经详细介绍了消息队列的作用,这一种我们直接来学习SpringBoot如何整合kafka发送消息. kafka简介 kafka是用Scala和Jav ...

  9. centos 6.4 配置本地yum源(iso镜像)

    1.先挂载 iso镜像  eg: mount -o loop /home/帐号/downloads/CentOS.iso /mnt/iso 2.用管理员帐号备份CentOS-Base.repo   e ...

  10. 多测师_svn_004

    svn 版本控制工具项目管理中的版本控制问题:解决代码冲突困难容易引发bug难于恢复至正确版本无法进行权限控制项目版本发布困难 什么是版本控制是指维护工程蓝图的表座做法,能追踪工程蓝图从诞生到定案的过 ...