开始之前,先介绍下swagger常用方法。

services.AddSwaggerGen    //添加swagger中间件

c.SwaggerDoc  //配置swagger文档,也就是右上角的下拉框内容

c.IncludeXmlComments  //引用程序集xml,用于加载出 备注信息等如图

c.AddSecurityDefinition  //添加授权验证

 c.DocInclusionPredicate    //核心方法,指定分组被加载时 回调进入,也就是swagger右上角下拉框内的分组加载时

每一个分组加载时都会遍历所有控制器的action 进入一次这个方法体内,返回true则 暴露 否则隐藏

                     c.DocInclusionPredicate((docName, apiDescription) =>
{
//docName分组 的apiDescription 方法是否暴露
//return true 暴露 反之 隐藏
return true;
});

DocInclusionPredicate 使用

多分组步骤:

1.定义自定义标签

     public class ApiGroupAttribute : Attribute
{
public ApiGroupAttribute(params ApiGroupNames[] name)
{
GroupName = name;
} public ApiGroupNames[] GroupName { get; set; } } public enum ApiGroupNames
{
[GroupInfo(Title = "登录接口", Description = "用于登录", Version = "")]
Login,
} public class GroupInfoAttribute : Attribute
{
public string Title { get; set; }
public string Version { get; set; }
public string Description { get; set; }
}

标签代码

2.将标签放在需要 分组的控制器或方法上

 //可加载多个标签,用于1个接口对应多个分组
[ApiGroup(ApiGroupNames.Login,ApiGroupNames.SubmitProgram)]

使用标签

3.利用枚举反射加载出每个分组的Doc

 services.AddSwaggerGen(c =>
{
//遍历ApiGroupNames所有枚举值生成接口文档,Skip(1)是因为Enum第一个FieldInfo是内置的一个Int值
typeof(ApiGroupNames).GetFields().Skip().ToList().ForEach(f =>
{
//获取枚举值上的特性
if (SwaggerEnumNames.Count(x => x.ToLower() == f.Name.ToLower()) > )
{
var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType<GroupInfoAttribute>().FirstOrDefault();
c.SwaggerDoc(f.Name, new Microsoft.OpenApi.Models.OpenApiInfo
{
Title = info?.Title,
Version = info?.Version,
Description = info?.Description
});
}
});
}

4.DocInclusionPredicate 内写核心逻辑代码,利用反射的类进行判断标签值

                     //判断接口归于哪个分组
c.DocInclusionPredicate((docName, apiDescription) =>
{
//反射拿到值
var actionlist = apiDescription.ActionDescriptor.EndpointMetadata.Where(x => x is ApiGroupAttribute);
if (actionlist.Count() > )
{
//判断是否包含这个分组
var actionfilter = actionlist.FirstOrDefault() as ApiGroupAttribute;
return actionfilter.GroupName.Count(x => x.ToString() == docName) > ;
}
return false;
}
});

DocInclusionPredicate逻辑代码

如需要全部接口暴露并不用打标签的,用SwaggerDoc单独加载一个Doc用于显示全部接口,在DocInclusionPredicate内加入 判断 如果docName等于全部接口的DocName那么直接return true即可,可灵活运行,可配置在json 也可配置在数据库等地方。用于指定分组是否暴露。以上加载Doc时, SwaggerEnumNames 就是需要暴露的分组列表,需要的自己定义来源

本文章参考 https://www.cnblogs.com/caijt/p/10739841.html 改写的 一对多分组模式。需要一对一的可以参考

Asp.Net Core Swagger 接口分组(支持接口一对多暴露)的更多相关文章

  1. ASP.NET Core WebApi基于JWT实现接口授权验证

    一.ASP.Net Core WebApi JWT课程前言 我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再 ...

  2. ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF SQLite 支持 上一章节我有提 ...

  3. .NET Core Swagger 的分组使, 以及相同Action能被多个分组公用,同时加载出尚未分组的数据出来

    1.本文章参考 点击链接跳转 改写的 一对多分组模式.需要一对一的可以参考 2.本文主要讲的是 一对多 分组公用, 同时把尚未分组的加载出来 3.效果演示GIF图: 具体操作代码如下: 1.在项目创建 ...

  4. Asp.Net Core: Swagger 与 Identity Server 4

    Swagger不用多说,可以自动生成Web Api的接口文档和客户端调用代码,方便开发人员进行测试.通常我们只需要几行代码就可以实现这个功能: ... builder.Services.AddSwag ...

  5. ASP.NET Core Swagger接入使用IdentityServer4 的 WebApi

    写在前面 是这样的,我们现在接口使用了Ocelot做网关,Ocelot里面集成了基于IdentityServer4开发的授权中心用于对Api资源的保护.问题来了,我们的Api用了SwaggerUI做接 ...

  6. asp.net core swagger使用及注意事项

    Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.是一款RESTFUL接口的文档在线自动生成+功能测试软件.主要目的是构建标准的.稳定的.可重 ...

  7. 如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理

    这篇文章介绍一下,如何使用VS2017给asp.net core添加容器支持,并发布镜像到私有docker hub,然后用chart管理容器镜像的操作流程. 话不多说,just do it. 新建项目 ...

  8. ASP .NET CORE 根据环境变量支持多个 appsettings.json

    0.背景 在开发项目的过程当中,生产环境与调试环境的配置肯定是不一样的.拿个最简单的例子来说,比如连接字符串这种东西,调试环境肯定是不能连接生产数据库的.在之前的话,这种情况只能说是你 COPY 两个 ...

  9. ASP.NET Core 中的 WebSocket 支持(转自MSDN)

    本文介绍 ASP.NET Core 中 WebSocket 的入门方法. WebSocket (RFC 6455) 是一个协议,支持通过 TCP 连接建立持久的双向信道. 它用于从快速实时通信中获益的 ...

随机推荐

  1. 破解东航的seriesid

    在查询东航航班的时候,请求数据中有个seriesid 调试js分析代码的过程就略过了,下面是整合的生成seriesid 的js代码 <script> function get_n(e, t ...

  2. Python os.fsync() 方法

    概述 os.fsync() 方法强制将文件描述符为fd的文件写入硬盘.在Unix, 将调用fsync()函数;在Windows, 调用 _commit()函数.高佣联盟 www.cgewang.com ...

  3. 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.

    考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...

  4. Phantomjs实现后端生成图片文件

    目录 PhantomJS简介 了解rasterize.js 使用方法 今天,给大家分享一个Java后端利用Phantomjs实现生成图片的功能,同学们使用的时候,可以参考下! PhantomJS简介 ...

  5. [转] 总结了N个真实线上故障

    以下文章来源于架构师进阶之路 ,作者二马读书 1. JVM频繁FULL GC快速排查 在分享此案例前,先聊聊哪些场景会导致频繁Full GC: 内存泄漏(代码有问题,对象引用没及时释放,导致对象不能及 ...

  6. Sharding-JDBC实现垂直拆分

    参考资料:猿天地  https://mp.weixin.qq.com/s/wl8h6LIQUHztVuVbjfsU3Q  作者:尹吉欢 当一个项目量增大,数据表数量增多时,就需要对数据表进行垂直拆分, ...

  7. MyBatis版本升级导致OffsetDateTime入参解析异常问题复盘

    背景 最近有一个数据统计服务需要升级SpringBoot的版本,由1.5.x.RELEASE直接升级到2.3.0.RELEASE,考虑到没有用到SpringBoot的内建SPI,升级过程算是顺利.但是 ...

  8. NCoreCoder.Aop 国庆更新

    原本的IAopActors如下 public interface IAopActors { object Execute(AopContext context); Task<TResult> ...

  9. 90行代码让微信地球转起来,太酷了!(python实现)

    1.微信地球 手机重启后打开微信的一瞬间,会看到一幅有名的图片,上面站着一个 张小龙 . 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. ...

  10. Python最好IDE:Pycharm使用小技巧总结,让你写代码更为舒适