Asp.net6.0 Swagger使用问题及解决过程

 更新时间:2022年05月05日 14:37:04   作者:毛毛虫  
这篇文章主要介绍了Asp.net6.0 Swagger使用备忘,文中介绍了在Docker中显示OpenApiInfo的中文内容,显示xml注释及如何显示Header的问题,需要的朋友可以参考下

“五一”期间用了一下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 页面中动态增加的控件、添加事件

    ASP.NET 页面中动态增加的控件、添加事件

    在ASP.NET中动态创建一个控件总是不那么顺利,特别是当对页面的Life Cycle不是那么了然的情况下!这里简单描述一下要求,然后提供一个解决方案,大家看看有没有更好的Idea,如果有的话就是我的大幸了,呵呵!
    2009-07-07
  • .NET 排序 Array.Sort<T> 实现示例

    .NET 排序 Array.Sort<T> 实现示例

    System.Array.Sort<T> 是.NET内置的排序方法, 本文就详细的介绍一下具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2021-09-09
  • datalist,Repeater和Gridview的区别分析

    datalist,Repeater和Gridview的区别分析

    datalist,Repeater和Gridview的区别分析,需要的朋友可以参考一下
    2013-03-03
  • ADO调用分页查询存储过程的实例讲解

    ADO调用分页查询存储过程的实例讲解

    下面小编就为大家分享一篇ADO调用分页查询存储过程的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • asp.net core 系列之并发冲突的深入理解

    asp.net core 系列之并发冲突的深入理解

    这篇文章主要介绍了asp.net core 系列之并发冲突的深入理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • .NET微信公众号查看关注者接口

    .NET微信公众号查看关注者接口

    这篇文章主要为大家详细介绍了.NET微信公众号查看关注者接口的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • .NET装饰模式讲解

    .NET装饰模式讲解

    这篇文章主要为大家详细介绍了ASP.NET装饰模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • WPF使用Canvas画布面板布局

    WPF使用Canvas画布面板布局

    这篇文章介绍了WPF使用Canvas画布面板布局的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • Asp.Net 动态页面转静态页面主要代码

    Asp.Net 动态页面转静态页面主要代码

    关于在Asp.Net中动态页面转静态页面的方法网上比较多。结合实际的需求,我在网上找了一些源代码,并作修改。现在把修改后的代码以及说明写一下。
    2009-12-12

最新评论