Asp.net6.0 Swagger使用问题及解决过程
“五一”期间用了一下Swagger,碰到了以下问题:
- 如何在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<OpenApiParameter>(); operation.Parameters.Add(new OpenApiParameter { Name = "Sign", In = ParameterLocation.Header, Description = "我的签名是这个生成的,巴拉巴拉巴拉", Required = true }); } } }
然后在SwaggerSetup里面添加一行options.OperationFilter<SwaggerOperationFilter>();
在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<SwaggerIgnoreAttribute>() != null) { schema.Title = "Remove"; } #endregion else { if (context.Type.IsEnum) { #region 设置枚举的描述 List<string> titleItems = new List<string>(); foreach (var e in Enum.GetValues(context.Type)) { if (context.Type.GetField(e.ToString()).GetCustomAttribute<SwaggerIgnoreAttribute>() == null) { titleItems.Add($"{(int)e}:{context.Type.GetField(e.ToString()).GetCustomAttribute<DescriptionAttribute>()?.Description ?? e}"); } } schema.Description = string.Join(";", titleItems); #endregion } else { #region 移除设置了SwaggerIgnoreAttribute特性的属性 foreach (var propertyName in context.Type.GetProperties().Where(ii => ii.GetCustomAttribute<SwaggerIgnoreAttribute>() != 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特性的ApiController var 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<SwaggerSchemaFilter>();
options.DocumentFilter<SwaggerDocFilter>();
然后给隐藏的内容添加[SwaggerIgnore]
如此,大致达到了我的目的,但存两点不爽:
- 脱裤子
- 隐藏类的方式
到此这篇关于Asp.net6.0 Swagger使用备忘的文章就介绍到这了,更多相关Asp.net6.0 Swagger使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Asp.net中使用DapperExtensions和反射来实现一个通用搜索
这篇文章主要介绍了Asp.net中使用DapperExtensions和反射来实现一个通用搜索功能,非常不错,具有参考解决价值,需要的朋友可以参考下2017-03-03Asp.net利用JQuery AJAX实现无刷新评论思路与代码
Asp.net利用JQuery AJAX实现无刷新评论,此功能是每一个从事asp.net开发者的朋友都希望实现的,本文利用闲暇时间整理了一些,有需要的朋友可以参考下2012-12-12IIS中ASP.NET连接SQL Server出错的解决方法
在IIS中运行的ASP.NET应用程序其所属用户名为ASPNET的特定用户,其默认权限是无法访问SQL Server的,更不可能访问ASP.NET应用程序的数据库了,因此要在IIS中访问SQL Server就需要给ASPNET帐户赋予相应的权限.2010-03-03DataGridView中绑定DataTable数据及相关操作实现代码
DataGridView中绑定DataTable数据及相关操作2010-02-02ASP.NET MVC 开发微信支付H5的实现示例(外置浏览器支付)
这篇文章主要介绍了ASP.NET MVC 开发微信支付H5的实现示例(外置浏览器支付),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-12-12asp.net使用DataSet的ReadXml读取XML文件及Stream流的方法
这篇文章主要介绍了asp.net使用DataSet的ReadXml读取XML文件及Stream流的方法,实例分析了asp.net以字符流的形式读取与写入xml文件的相关技巧,需要的朋友可以参考下2016-06-06
最新评论