dotnet core swagger filter 隐藏接口和显示枚举描述
dotnet core 2.2开发项目中,常会使用Swagger UI来生成在线Api文档。
某些接口不想放到Swagger中可以这样写Filter:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /// <summary> /// 隐藏swagger接口特性标识 /// </summary> [System.AttributeUsage(System.AttributeTargets.Method | System.AttributeTargets.Class)] public partial class HiddenApiAttribute : System.Attribute { } /// <summary> /// 隐藏接口,不生成到swagger文档展示 /// </summary> public class HiddenApiFilter : IDocumentFilter { /// <summary> /// 过滤器 /// </summary> /// <param name="swaggerDoc"></param> /// <param name="context"></param> public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context) { foreach (ApiDescription apiDescription in context.ApiDescriptions) { if (apiDescription.TryGetMethodInfo( out MethodInfo method)) { if (method.ReflectedType.CustomAttributes.Any(t => t.AttributeType == typeof (HiddenApiAttribute)) || method.CustomAttributes.Any(t => t.AttributeType == typeof (HiddenApiAttribute))) { string key = "/" + apiDescription.RelativePath; if (key.Contains( "?" )) { int idx = key.IndexOf( "?" , System.StringComparison.Ordinal); key = key.Substring(0, idx); } swaggerDoc.Paths.Remove(key); } } } } } |
注意:他不能隐藏一个Controller中的某个Method,比如仅隐藏Post或Get方法,因为它是对路由Paths.Remove
Starts.cs中加入代码:
1 | c.DocumentFilter<HiddenApiFilter>(); |
Controller类或某个方法加入代码:
1 2 3 4 5 | [HiddenApi] public class ValuesController : ControllerBase { ... } |
显示枚举描述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | /// <summary> /// Add enum value descriptions to Swagger /// </summary> public class EnumDocumentFilter : IDocumentFilter { /// <inheritdoc /> public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context) { // add enum descriptions to result models foreach ( var schemaDictionaryItem in swaggerDoc.Definitions) { var schema = schemaDictionaryItem.Value; foreach ( var propertyDictionaryItem in schema.Properties) { var property = propertyDictionaryItem.Value; var propertyEnums = property.Enum; if (propertyEnums != null && propertyEnums.Count > 0) { property.Description += DescribeEnum(propertyEnums); } } } } private static string DescribeEnum(IEnumerable< object > enums) { var enumDescriptions = new List< string >(); Type type = null ; foreach ( var enumOption in enums) { if (type == null ) type = enumOption.GetType(); enumDescriptions.Add($ "{Convert.ChangeType(enumOption, type.GetEnumUnderlyingType())} = {Enum.GetName(type, enumOption)},{GetDescription(type, enumOption)}" ); } return $ "{Environment.NewLine}{string.Join(Environment.NewLine, enumDescriptions)}" ; } public static string GetDescription(Type t, object value) { foreach (MemberInfo mInfo in t.GetMembers()) { if (mInfo.Name == t.GetEnumName(value)) { foreach (Attribute attr in Attribute.GetCustomAttributes(mInfo)) { if (attr.GetType() == typeof (DescriptionAttribute)) { return ((DescriptionAttribute)attr).Description; } } } } return string .Empty; } } |
Starts.cs中加入代码:
1 | c.DocumentFilter<EnumDocumentFilter>(); |
以上。
分类:
dotnet core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人