ASP.NET Core Web API Swagger 按标签Tags分组排序显示
需求
- swagger页面按标签Tags分组显示。
- 没有打标签Tags的接口,默认归到"未分组"。
- 分组内按接口路径排序
说明
为什么没有使用GroupName对接口进行分组?
暂时不需要,以及不想点击swagger页面右上角那个下拉框。
当然Tags和GroupName不冲突,不影响通过GroupName再分组显示。
如何实现
1. 为controller或action打上标签
TagsAttribute特性可以打在controller类上,也可以打在action方法上,一个类或方法上可以打多个标签。示例:
[Tags("标签1", "标签2")]
有个小坑,Tags要么打在controller上,要么打在action上,不能同时打。
2. 实现IDocumentFilter接口
清空原有的Tags,并按接口类或方法上的标签重新添加Tags,然后排序。
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using Utils;
namespace DotnetDatamining.Filters
{
/// <summary>
/// Workaround for https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/2162
/// When adding XML controller descriptions to the swagger description document,
/// controllers are listed out of alphabetical order.
///
/// This filter explicitly reorders them.
/// </summary>
public class TagReorderDocumentFilter : IDocumentFilter
{
/// <summary>
/// Allows customization of the swagger description document
/// </summary>
/// <param name="swaggerDoc">The generated swagger description document</param>
/// <param name="context">Context information</param>
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
swaggerDoc.Tags.Clear(); //清空Tags
//重新添加Tags
foreach (var path in swaggerDoc.Paths)
{
foreach (var o in path.Value.Operations)
{
foreach (var tag in o.Value.Tags)
{
swaggerDoc.Tags.Add(tag);
}
}
}
//排序
swaggerDoc.Tags = swaggerDoc.Tags
.OrderBy(tag => TinyPinYinUtil.GetPinYin(tag.Name)) //按汉字拼音排序
.ToList();
}
}
}
3. Swagger配置
//swagger配置
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo
{
Title = "XXX",
Version = "1.0",
Description = "XXX"
});
var path = Path.Combine(AppContext.BaseDirectory, "DotnetDatamining.xml"); // xml文档绝对路径
c.IncludeXmlComments(path, true); // 显示控制器层注释
c.TagActionsBy(a =>
{
var tagAttr = a.ActionDescriptor.EndpointMetadata.OfType<TagsAttribute>().FirstOrDefault();
if (tagAttr != null)
{
return tagAttr.Tags.ToList();
}
return new List<string>() { "未分组" };
});
c.DocumentFilter<TagReorderDocumentFilter>(); // Workaround: After adding XML controller descriptions, they are listed out of alphabetical order
c.OrderActionsBy(a => a.RelativePath); // 对Action排序
});
上述代码说明
(1) 使用TagReorderDocumentFilter过滤器
c.DocumentFilter<TagReorderDocumentFilter>();
(2) 对Action按标签分组
没有打标签Tags的接口,默认归到"未分组"。
c.TagActionsBy(a =>
{
var tagAttr = a.ActionDescriptor.EndpointMetadata.OfType<TagsAttribute>().FirstOrDefault();
if (tagAttr != null)
{
return tagAttr.Tags.ToList();
}
return new List<string>() { "未分组" };
});
(2) 分组内对Action按接口路径排序
c.OrderActionsBy(a => a.RelativePath);
效果图
分组按汉字拼音排序,分组内按接口路径排序

在实现过程中遇到的问题
- 部署到linux系统,中文拼音排序问题,不想修改linux系统配置,于是修改代码,通过TinyPinyin.Net库实现。
- 分组排序和分组内接口排序问题
一个接口可以打多个标签。如果是单个标签,可以通过OrderActionsBy对分组和接口同时排序。如果是多个标签,则无法通过OrderActionsBy对分组和接口同时排序,只能对接口进行排序。
可以在TagReorderDocumentFilter过滤器中对标签进行排序,但Tags中都是controller默认的标签,所以要先清空,再重新添加,然后再排序。
为了解决这些问题,提供一个容易查找的swagger文档目录,断断续续花费了很长时间才算解决。
ASP.NET Core Web API Swagger 按标签Tags分组排序显示的更多相关文章
- 在ASP.NET Core Web API上使用Swagger提供API文档
我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的API文档功能.当设置IISExpress的默认启动路由到Swagger的API文档页 ...
- 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)
对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...
- ASP.NET Core Web API中使用Swagger
本节导航 Swagger介绍 在ASP.NET CORE 中的使用swagger 在软件开发中,管理和测试API是一件重要而富有挑战性的工作.在我之前的文章<研发团队,请管好你的API文档& ...
- asp.net core web api 生成 swagger 文档
asp.net core web api 生成 swagger 文档 Intro 在前后端分离的开发模式下,文档就显得比较重要,哪个接口要传哪些参数,如果一两个接口还好,口头上直接沟通好就可以了,如果 ...
- Asp.Net Core Web Api 使用 Swagger 生成 api 说明文档
最近使用 Asp.Net Core Web Api 开发项目服务端.Swagger 是最受欢迎的 REST APIs 文档生成工具之一,进入我的视野.以下为学习应用情况的整理. 一.Swagger 介 ...
- 如何在ASP.NET Core Web API测试中使用Postman
使用Postman进行手动测试 如果您是开发人员,测试人员或管理人员,则在构建和使用应用程序时,有时了解各种API方法可能是一个挑战. 使用带有.NET Core的Postman为您的Web API生 ...
- 在docker中运行ASP.NET Core Web API应用程序
本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...
- docker中运行ASP.NET Core Web API
在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过 ...
- [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了
[译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 本文首发自:博客园 文章地址: https://www.cnblogs.com/yilezhu/p/ ...
- List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac
List多个字段标识过滤 class Program{ public static void Main(string[] args) { List<T> list = new List& ...
随机推荐
- 062_Apex使用Assert
assert关键字用法简单,但是使用assert往往会让你陷入越来越深的陷阱中.应避免使用.总结了以下原因: 1.用assert代替if是陷阱之二.assert的判断和if语句差不多,但两者的作用 ...
- 【SSO单点系列】(2):CAS4.0 之 跨域 Ajax 登录实践
CAS4.0 之 跨域 Ajax 登录实践 一.问题描述 CAS实现单点 实现一处登录 可访问多个应用 . 但是原登录是CAS默认登录页面和登出页面是无法重定向到自定义页面的 此处使用Ajax+I ...
- linux下安装JDK 1.8 (Open JDK)
CenterOS 7 阿里云,华为云都可以 检测是否已经安装过JDK yum list --installed|grep jdk 或者java -version看下能不能执行. 如果已安装过但jdk ...
- jenkins +docker+python接口自动化之jenkins容器下安装python项目所需要的库(三)
1.场景 1.centos系统,在docker的jenkins容器下安装python项目所需要的包 2.我们目前是搞接口自动化,代码放到码云上,运行环境是jenkins容器下,所以需要在jenkins ...
- 开发Unity3D移动端输入插件 UGUI Touch Input Component
UGUI Touch Input Component 为了在移动设备上操控角色,本人便开发了UGUI Touch Input Component输入类插件. 特点 本插件中总共包含三种组件:the v ...
- ElasticSeach性能调优
1. 硬件相关 1.1 硬盘 一块好的硬盘,会带来ES整体性能10倍以上提升,推荐在datanode节点上使用SSD硬盘,索引的data目录,存放在SSD硬盘上. 1.2 内存 建议内存>128 ...
- Jetpack compose学习笔记之自定义layout(布局)
一,简介 Compose中的自定义Layout主要通过LayoutModifier和Layout方法来实现. 不管是LayoutModifier还是Layout,都只能measure一次它的孩子Vie ...
- 12.20linux学习第十九天
今天老刘开始讲第17章 使用iSCSI服务部署网络存储.第18章 使用MariaDB数据库管理系统和第19章 使用PXE+Kickstart无人值守安装服务,内容有点多. 7.1 iSCSI技术介绍 ...
- gulp技术:自动化构建工具
作用:压缩css.js.img,合并文件,改名字,编译sass,拷贝 使用步骤: 1.安装node环境,下一步,下一步,安装C盘: 2.在你的根目录下,在地址栏输入cmd回车: 3.检测node和np ...
- 如何跳出forEach循环
for(let ii in this.listData){ console.log("提交前数据",ii) try{ this.listData[ii].forEach((el,i ...