前言

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

版本控制

1.导入相关nuget。Swashbuckle.AspNetCore,nswag.AspNetCore.

2.添加api多版本控制服务

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

如果不指定版本路由那么定义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")]即可。

但是两个相同的版本中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 };//如果相同版本信息路由下增加   
           [ApiExplorerSettings(GroupName = "v1")]进行区分即可
//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多版本控制与swagger(nswag)配置的更多相关文章

  1. net core webapi多版本控制与nswag 交互

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

  2. Asp.net core WebApi 使用Swagger生成帮助页

    最近我们团队一直进行.net core的转型,web开发向着前后端分离的技术架构演进,我们后台主要是采用了asp.net core webapi来进行开发,开始每次调试以及与前端人员的沟通上都存在这效 ...

  3. Asp.net core WebApi 使用Swagger生成帮助页实例

    最近我们团队一直进行.net core的转型,web开发向着前后端分离的技术架构演进,我们后台主要是采用了asp.net core webapi来进行开发,开始每次调试以及与前端人员的沟通上都存在这效 ...

  4. net core WebApi 使用Swagger

    Asp.net core WebApi 使用Swagger生成帮助页 最近我们团队一直进行.net core的转型,web开发向着前后端分离的技术架构演进,我们后台主要是采用了asp.net core ...

  5. .net core webapi 前后端开发分离后的配置和部署

    背景:现在越来越多的企业都采用了在开发上前后端分离,前后端开发上的分离有很多种,那么今天,我来分享一下项目中得的前后端分离. B/S  Saas 项目:(这个项目可以理解成个人中心,当然不止这么点功能 ...

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

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

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

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

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

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

  9. Asp.net Core WebApi 使用Swagger做帮助文档,并且自定义Swagger的UI

    WebApi写好之后,在线帮助文档以及能够在线调试的工具是专业化的表现,而Swagger毫无疑问是做Docs的最佳工具,自动生成每个Controller的接口说明,自动将参数解析成json,并且能够在 ...

随机推荐

  1. JS实现动态显示时间(最简单方法)

    使用JS实现动态显示时间 最简单实现方法 直接在网页适当的位置中插入如下js代码,(id="datetime") 不可省略. <div id="datetime&q ...

  2. SpringCloud Alibaba系列(三) Sentinel热点参数限流

    愿你生命中有够多的云翳,造就一个美好的黄昏 欢迎关注公众号[渣男小四],一个喜欢技术更喜欢艺术的青年 一.介绍 热点即经常访问的数据.很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据 ...

  3. 认证授权:IdentityServer4 - 数据持久化

    前言: 前面的文章中IdentityServer4 配置内容都存储到内存中,本篇文章开始把配置信息存储到数据库中:本篇文章继续基于github的代码来实现配置数据持久化到MySQL中 一.基于EFCo ...

  4. 如何设置UITextField的焦点?

    需要一进VIEW就显示键盘. 在viewDidLoad函数中调用:[yourUITextField becomeFirstResponder];

  5. Jupyter 绘图怎么显示中文

    1. 简单加2行代码即可. import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = [u'SimHei'] plt.rcPa ...

  6. Solon详解(11)- Mybatis 与 Solon 相亲相爱

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  7. requests-html添加header

    from requests_html import HTMLSession session = HTMLSession() headers = { "User-Agent":&qu ...

  8. C# 微信access_token缓存和过期刷新

    摘自:http://blog.csdn.net/hechurui/article/details/22398849 首先建立一个Access_token类 /// <summary> // ...

  9. C# 获取两点(经纬度表示)间的距离

    #region 获取两点(经纬度表示)间的距离 /// <summary> /// 获取两点(经纬度表示)间的距离 /// </summary> /// <param n ...

  10. MVC查询

    前言 最近没什么好写的,所以写个查询来巩固一下知识 HTML @{ Layout = null; } <!DOCTYPE html> <html> <head> & ...