Asp.net6.0|Asp.net6.0 Swagger使用问题及解决过程
目录
- 一、在Docker中显示OpenApiInfo的中文内容
- 二、显示xml注释
- 三、如何显示Header
- 四、隐藏ApiController、Action、类或者属性,显示枚举
- 如何在Docker中显示OpenApiInfo的中文内容;
- 如何显示xml注释;
- 如何显示Header;
- 如何隐藏ApiController、Action、类或者属性,如何显示枚举
一、在Docker中显示OpenApiInfo的中文内容
builder.Services.AddSwaggerGen(options =>{options.SwaggerDoc("v1", new OpenApiInfo{Version = "v1",Title = "xxx Api调用说明",Description = "巴拉巴拉的一堆描述",License = new OpenApiLicense{Name = "Api调用须知",Url = new Uri("http://xxx.com/readmi.html")}}); });
以上设置的效果
文章图片
然而发布到Docker以后,中文乱码了(似乎在Program.cs里面输入的中文都会乱码)。我的解决的办法是:
builder.Services.AddSwaggerGen(ProgramHelper.SwaggerSetup);
using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; namespace SwaggerDemo; public static class ProgramHelper{public static void SwaggerSetup(SwaggerGenOptions options){options.SwaggerDoc("v1", new OpenApiInfo{Version = "v1",Title = "xxx Api调用说明",Description = "巴拉巴拉的一堆描述",License = new OpenApiLicense{Name = "Api调用须知",Url = new Uri("http://xxx.com/readmi.html")}}); }}
问题解决,但有点脱裤子放屁,不知道有没有不需要脱裤子的方法。
二、显示xml注释 这个微软文档说的很清楚,这里记一下网址备查。
三、如何显示Header
文章图片
办法如下:
public class SwaggerHeaderAttribute : Attribute { }public class SwaggerOperationFilter : IOperationFilter{public void Apply(OpenApiOperation operation, OperationFilterContext context){if (context.ApiDescription.CustomAttributes().Any(ii => ii.GetType() == typeof(SwaggerHeaderAttribute))|| context.ApiDescription.ActionDescriptor.EndpointMetadata.Any(ii => ii.GetType() == typeof(SwaggerHeaderAttribute))){if (operation.Parameters == null)operation.Parameters = new List(); operation.Parameters.Add(new OpenApiParameter{Name = "Sign",In = ParameterLocation.Header,Description = "我的签名是这个生成的,巴拉巴拉巴拉",Required = true}); }}}
然后在SwaggerSetup里面添加一行
options.OperationFilter();
在ApiController或者Action前面添加一行
[SwaggerHeader]
四、隐藏ApiController、Action、类或者属性,显示枚举
文章图片
想把1、2隐藏起来,把
public enum ECode{成功,[Description("时间戳错误")]Timestamp,[Description("签名错误")]Sign}
显示成3的样子,办法如下:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Enum | AttributeTargets.Field)]public partial class SwaggerIgnoreAttribute : Attribute { }public class SwaggerSchemaFilter : ISchemaFilter{public void Apply(OpenApiSchema schema, SchemaFilterContext context){#region 给设置了SwaggerIgnoreAttribute特性的类作个标记,以便在DocumentFilter里面移除整个架构if (context.Type.GetCustomAttribute() != null){schema.Title = "Remove"; }#endregionelse{if (context.Type.IsEnum){#region 设置枚举的描述List titleItems = new List(); foreach (var e in Enum.GetValues(context.Type)){if (context.Type.GetField(e.ToString()).GetCustomAttribute() == null){titleItems.Add($"{(int)e}:{context.Type.GetField(e.ToString()).GetCustomAttribute()?.Description ?? e}"); }}schema.Description = string.Join(";", titleItems); #endregion}else{#region 移除设置了SwaggerIgnoreAttribute特性的属性foreach (var propertyName in context.Type.GetProperties().Where(ii => ii.GetCustomAttribute() != null).Select(ii => ii.Name))schema.Properties.Remove(propertyName); #region}}}}public class SwaggerDocFilter : IDocumentFilter{public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context){//移除在SchemaFilter作了标记的架构foreach (var key in swaggerDoc.Components.Schemas.Where(ii => ii.Value.Title == "Remove"))swaggerDoc.Components.Schemas.Remove(key); #region 移除设置了SwaggerIgnoreAttribute特性的ApiControllervar ignoreApis = context.ApiDescriptions.Where(wh => wh.ActionDescriptor.EndpointMetadata.Any(any => any is SwaggerIgnoreAttribute)); if (ignoreApis != null){foreach (var ignoreApi in ignoreApis){swaggerDoc.Paths.Remove("/" + ignoreApi.RelativePath); }}#endregion}}
照例需要在在SwaggerSetup里面添加两行
options.SchemaFilter();
options.DocumentFilter();
然后给隐藏的内容添加
[SwaggerIgnore]
如此,大致达到了我的目的,但存两点不爽:
- 脱裤子
- 隐藏类的方式
推荐阅读
- Angular2中constructor和ngOninit的使用讲解
- 如何使用命令对Android系统进行截屏
- 测试覆盖率|测试覆盖率 之 Cobertura的使用
- MPAndroidChart简单使用
- 【GitLab】使用Docker和Docker-Compose部署-个人、私有代码仓库
- uniapp计算属性的使用
- Redis使用脚本详解
- android 使用NDK api调用AssetManager
- android使用service
- C# Dapper基本三层架构使用 (DAL)