Asp.net6.0 Swagger使用備忘

来源:https://www.cnblogs.com/catzhou/archive/2022/05/05/16223772.html
-Advertisement-
Play Games

“五一”期間用了一下Swagger,碰到了以下問題: 如何在Docker中顯示OpenApiInfo的中文內容; 如何顯示xml註釋; 如何顯示Header; 如何隱藏ApiController、Action、類或者屬性,如何顯示枚舉 現將解決辦法記下留存。 一、在Docker中顯示OpenApiI ...


“五一”期間用了一下Swagger,碰到了以下問題:

  1. 如何在Docker中顯示OpenApiInfo的中文內容;
  2. 如何顯示xml註釋;
  3. 如何顯示Header;
  4. 如何隱藏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]

如此,大致達到了我的目的,但存兩點不爽:

  • 脫褲子
  • 隱藏類的方式
    若有答案,煩請告知,先謝!

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 利用Python製作遠程查看別人電腦的操作記錄,與其它教程類似,都是通過郵件返回。 利用程式得到目標電腦瀏覽器當中的訪問記錄,生產一個文本併發送到你自己的郵箱,當然這個整個過程除了你把python程式植 入目標電腦外,其它的操作都是自動化的。 我知道我說到這些,有些人又開始有其它的想法了,可別 ...
  • #volatile關鍵字 ##什麼是可見性? 可見性是指線程A改變變數的值後,線程B可以馬上看到更改後變數的值 ##volatile的作用 關鍵字volatile提示線程每次從共用記憶體中讀取數據,而不是從私有記憶體中讀取,這樣就保證了同步數據的可見性 ##關鍵字volatile適用的場景 當想實現一個 ...
  • HandlerInterceptor源碼 ##3種方法: preHandle:攔截於請求剛進入時,進行判斷,需要boolean返回值,如果返回true將繼續執行,如果返回false,將不進行執行。一般用於登錄校驗。 postHandle:攔截於方法成功返回後,視圖渲染前,可以對modelAndVie ...
  • 在文章的開頭,先說下NPE問題,NPE問題就是,我們在開發中經常碰到的NullPointerException.假設我們有兩個類,他們的UML類圖如下圖所示 在這種情況下,有如下代碼 user.getAddress().getProvince(); 這種寫法,在user為null時,是有可能報Nul ...
  • 前言 大家都喜歡搞笑視頻倒放吧,視頻倒放會給人不一樣的感覺,比起按照原本的劇本,倒放的效果給人的感覺更出乎意料。所以, 我就想可不可以用Python實現視頻或者圖片倒放呢?於是,我做到了,我想把它分享給大家,讓大家跟我一起玩。 開始分享今天的技術之前,先來看幾個動圖(gif) (原圖1) (倒放1) ...
  • 寫文件有三種模式: 截斷寫,文件打開之後立即清空原有內容 附加寫,文件打開之後不清空原有內容,每次只能在文件最後寫入 覆蓋寫,文件打開之後不清空原有內容,可以在文件任意位置寫入 例如:文件原有內容為 123456,在開始位置覆蓋寫入 abcd,最後文件內容為 abcd56。首先使用下麵的代碼進行嘗試 ...
  • 1.什麼是Elasticserach? 一個由Java語言開發的全文搜索引擎,全文檢索就是根據用戶輸入查詢字元的片段,能查詢出包含片段的數據,簡單來說就是一個分散式的搜索與分析引擎,它可以完成分散式部署,結構化檢索,以及數據分析功能,主要是應用在微服務系統中。 我們使用大白話簡單的形式解釋,舉個例子 ...
  • 在Excel中,可對單元格中的字元串設置多種不同樣式,通常只需要獲取到單元格直接設置樣式即可,該方法設置的樣式會應用於該單元格中的所有字元。如果需要對單元格中某些字元設置樣式,則可以參考本文中的方法。本文,將以C#及VB.NET代碼為例,介紹如何在Excel同一個單元格中應用多種字體樣式,包括字體加 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...