1.本文章参考 点击链接跳转 改写的 一对多分组模式。需要一对一的可以参考

2.本文主要讲的是 一对多 分组公用, 同时把尚未分组的加载出来

3.效果演示GIF图:

具体操作代码如下:

1.在项目创建一个目录(ApiGroup),然后创建三个类,分别为ApiGroupAttribute.cs(控制器特性),ApiGroupNames.css(系统分组枚举),GroupInfoAttribute.cs(给系统分组枚举值增加相关信息的特性,这个主要是用于在Swagger分组时可关联Title,Version,Description值)

ApiGroupAttribute.cs代码如下

 /// <summary>
/// 系统分组特性
/// </summary>
public class ApiGroupAttribute : Attribute
{
public ApiGroupAttribute(params ApiGroupNames[] name)
{
GroupName = name;
}
public ApiGroupNames[] GroupName { get; set; }
}

ApiGroupNames.cs代码如下

/// <summary>
/// 系统分组枚举值
/// </summary>
public enum ApiGroupNames
{
[GroupInfo(Title = "All", Description = "All接口", Version = "")]
All = 0,
[GroupInfo(Title = "尚未分组", Description = "尚未分组相关接口", Version = "")]
NoGroup = 1,
[GroupInfo(Title = "登录认证", Description = "登录认证相关接口", Version = "")]
Login = 2,
[GroupInfo(Title = "IT", Description = "登录认证相关接口", Version = "")]
It = 3,
[GroupInfo(Title = "人力资源", Description = "登录认证相关接口", Version = "")]
Hr = 4,
[GroupInfo(Title = "系统配置", Description = "系统配置相关接口", Version = "")]
Config = 5
}

GroupInfoAttribute.cs代码如下

public class GroupInfoAttribute : Attribute
{
public string Title { get; set; }
public string Version { get; set; }
public string Description { get; set; }
}

******** 打开Startup.cs文件修改ConfigureServices方法(为了方便查看,只列出关于Swagger分组的关键代码)*************

//1.0 ConfigureServices 里面swagger 的设置
#region swagger

            var openApiInfo = new OpenApiInfo
{
Version = "v1",
Title = "WebApi",
Description = "A simple example ASP.NET Core Web API",
TermsOfService = new Uri("https://www.cnblogs.com/goodluckily/"),
Contact = new OpenApiContact
{
Name = "雨太阳",
Email = string.Empty,
Url = new Uri("https://www.cnblogs.com/goodluckily/")
},
License = new OpenApiLicense
{
Name = "许可证名字",
Url = new Uri("https://www.cnblogs.com/goodluckily/")
}
}; services.AddSwaggerGen(c =>
{
#region 分组方案二 //遍历ApiGroupNames所有枚举值生成接口文档,Skip(1)是因为Enum第一个FieldInfo是内置的一个Int值
typeof(ApiGroupNames).GetFields().Skip(1).ToList().ForEach(f =>
{
//获取枚举值上的特性
var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType<GroupInfoAttribute>().FirstOrDefault();
openApiInfo.Title = info?.Title;
openApiInfo.Version = info?.Version;
openApiInfo.Description = info?.Description;
c.SwaggerDoc(f.Name, openApiInfo);
}); //判断接口归于哪个分组
c.DocInclusionPredicate((docName, apiDescription) =>
{
if (!apiDescription.TryGetMethodInfo(out MethodInfo method)) return false;
//1.全部接口
if (docName == "All") return true;
//反射拿到控制器分组特性下的值
var actionlist = apiDescription.ActionDescriptor.EndpointMetadata.FirstOrDefault(x => x is ApiGroupAttribute);
//2.得到尚未分组的接口***************
if (docName == "NoGroup") return actionlist == null ? true : false;
//3.加载对应已经分好组的接口
if (actionlist != null)
{
//判断是否包含这个分组
var actionfilter = actionlist as ApiGroupAttribute;
return actionfilter.GroupName.Any(x => x.ToString().Trim() == docName);
}
return false;
}); #endregion //添加授权 //认证方式,此方式为全局添加 var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
c.IncludeXmlComments(xmlPath, true);
});
#endregion

2.0 Configure 里面swagger 的设置

 #region Swagger

            app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.RoutePrefix = "swagger"; #region 分组方案二
//遍历ApiGroupNames所有枚举值生成接口文档,Skip(1)是因为Enum第一个FieldInfo是内置的一个Int值
typeof(ApiGroupNames).GetFields().Skip(1).ToList().ForEach(f =>
{
//获取枚举值上的特性
var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType<GroupInfoAttribute>().FirstOrDefault();
c.SwaggerEndpoint($"/swagger/{f.Name}/swagger.json", info != null ? info.Title : f.Name);
});
#endregion //swagger 默认折叠
//c.DocExpansion(Swashbuckle.AspNetCore.SwaggerUI.DocExpansion.None); //MiniProfiler用的
c.IndexStream = () => GetType().GetTypeInfo().Assembly.GetManifestResourceStream("WebApi.index.html");
}); #endregion

然后你F6生成一下,没出错的话,就Ctrl+F5看看,正常的话就会在Swagger右上角看到分组了。

 *********************具体在 WeatherForecastController 里面的使用***************

1.单个Action特性 [ApiGroup(ApiGroupNames.Config)]

2.多个Action特性 [ApiGroup(ApiGroupNames.Login,ApiGroupNames.It)]

..............

具体详细的Controller代码如下

    [ApiController]
[Route("[controller]")]
public class WeatherForecastController : Controller
{ private readonly ILogger<WeatherForecastController> _logger; private readonly IHttpContextAccessor _accessor;
public WeatherForecastController(ILogger<WeatherForecastController> logger, IHttpContextAccessor accessor)
{
_logger = logger;
_accessor = accessor;
}
/// <summary>
/// 多分组共用请求
/// </summary>
/// <returns></returns>
//[ProducesResponseType(201)]
//[ProducesResponseType(400)] [HttpGet("getLoginAndIT")]
[ApiGroup(ApiGroupNames.Login,ApiGroupNames.It)]
public IActionResult GetLoginAndIT()
{
return Json("GetLoginAndIT ok");
} [HttpGet("getConfig")]
[ApiGroup(ApiGroupNames.Config)]
public IActionResult GetConfig()
{
return Json("Config ok");
} [HttpGet("getHr")]
[ApiGroup(ApiGroupNames.Hr)] public IActionResult GetHr()
{
return Json("Hr ok");
} [HttpGet("getIt")]
[ApiGroup(ApiGroupNames.It)] public IActionResult GetIt()
{
return Json("GetIt ok");
}
/// <summary>
/// 获取Miniprofiler Index的 Script (尚未分组的)
/// </summary>
/// <returns></returns>
[HttpGet("getMiniprofilerScript")]
public IActionResult getMiniprofilerScript()
{
var htmlstr = MiniProfiler.Current.RenderIncludes(_accessor.HttpContext);
var script = htmlstr.Value;
return Json(script);
}
}

-----------至此结束 end ----------------------------------

有疑问意见等,欢迎大家讨论.......

 

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

  1. .NET Core配置文件加载与DI注入配置数据

    .NET Core配置文件 在以前.NET中配置文件都是以App.config / Web.config等XML格式的配置文件,而.NET Core中建议使用以JSON为格式的配置文件,因为使用起来更 ...

  2. [转].NET Core配置文件加载与DI注入配置数据

    本文转自:http://www.cnblogs.com/skig/p/6079187.html .NET Core配置文件 在以前.NET中配置文件都是以App.config / Web.config ...

  3. Web版RSS阅读器(二)——使用dTree树形加载rss订阅分组列表

    在上一边博客<Web版RSS阅读器(一)——dom4j读取xml(opml)文件>中已经讲过如何读取rss订阅文件了.这次就把订阅的文件读取到页面上,使用树形结构进行加载显示. 不打算使用 ...

  4. 【ASP.NET Core】EF Core - “影子属性” 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1

    [ASP.NET Core]EF Core - “影子属性”   有朋友说老周近来博客更新较慢,确实有些慢,因为有些 bug 要研究,另外就是老周把部分内容转到直播上面,所以写博客的内容减少了一点. ...

  5. Asp.Net Core Swagger 接口分组(支持接口一对多暴露)

    开始之前,先介绍下swagger常用方法. services.AddSwaggerGen    //添加swagger中间件 c.SwaggerDoc  //配置swagger文档,也就是右上角的下拉 ...

  6. EntityFramework Core饥饿加载忽略导航属性问题

    前言 .NET Core项目利用EntityFramework Core作为数据访问层一直在进行中,一直没有过多的去关注背后生成的SQL语句,然后老大捞出日志文件一看,恩,有问题了,所以本文产生了,也 ...

  7. [翻译 EF Core in Action 2.4] 加载相关数据

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  8. 分享一个集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo+SkyWalking的微服务开发框架

    集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo的微服务开发框架 Github源代码地址 htt ...

  9. .net core swagger汉化

    基本swagger使用不再详解,具体百度其它帖子 1.将汉化的swagger js文件复制到项目根目录中 js代码如下 'use strict'; /** * Translator for docum ...

随机推荐

  1. JavaWeb——B/S,C/S结构,HTTP协议

    B/S: 开发基于B/S结构项目:目前主要采用三种服务器端语言:JSP,PHP,ASP.NET. 这三种语言构成三种常用应用开发组合:JSP+Oracle组合.PHP+MySQL体系.以及ASP.NE ...

  2. 34.vsftpd服务程序--虚拟用户模式

    1.创建用于进行FTP 认证的用户数据库文件,其中奇数行为账户名,偶数行为密码. [root@localhost ~]# cd /etc/vsftpd/ [root@localhost vsftpd] ...

  3. (4)Linux常用的运维平台和工具

    运维工程师使用的运维平台和工具包括: Web服务器:apache.tomcat.nginx.lighttpd 监控:nagios.ganglia.cacti.zabbix 自动部署:ansible.s ...

  4. 面试官:请讲一下Redis主从复制的功能及实现原理

    摘要:Redis在主从模式下会有许多问题需要考虑,这里写了一些关于redis在多服务器下的一些问题分析和总结. Redis单节点存在单点故障问题,为了解决单点问题,一般都需要对redis配置从节点,然 ...

  5. 【xml】Button背景色无法修改

    由于新版本的主题问题,导致Android Studio的Button背景无法修改,一直呈现亮紫色. 解决方法:将app/res/values目录下的themes代码加上.Bridge即可 修改前: & ...

  6. GPTL L3-003 社交集群(并查集)

    数据有些弱,Union函数不判不等也可以过. 题意: 依次给出 n 个人的兴趣,不同人兴趣相交.不同兴趣所属人员相交均属于同一集群,求形成的不相交集群个数及每个集群的人数. 思路: 枚举每个兴趣的人员 ...

  7. Codeforces Round #648 (Div. 2) E. Maximum Subsequence Value 贪心

    题意:E.Maximum Subsequence Value 题意: 给你n 个元素,你挑选k个元素,那么这个 k 集合的值为 ∑2i,其中,若集合内至少有 max(1,k−2)个数二进制下第 i 位 ...

  8. hdu1828 Picture(线段树+扫描线+矩形周长)

    看这篇博客前可以看一下扫描线求面积:线段树扫描线(一.Atlantis HDU - 1542(覆盖面积) 二.覆盖的面积 HDU - 1255(重叠两次的面积))  解法一·:两次扫描线 如图我们可以 ...

  9. xml——dom&sax解析、DTD&schema约束

    dom解析实例: 优点:增删改查一些元素等东西方便 缺点:内存消耗太大,如果文档太大,可能会导致内存溢出 sax解析: 优点:内存压力小 缺点:增删改比较复杂 当我们运行的java程序需要的内存比较大 ...

  10. bfs输出路径 && 最短路(迪杰斯特拉)输出路径

    问题描述 解决方法 1.像第一个问题那就是最短路问题(我代码采用迪杰斯特拉算法)实现 2.换乘次数最少,那就用bfs广搜来寻找答案.但是我的代码不能保证这个最少换乘是最短路程 代码 1 #includ ...