在MVC項目中使用 Swagger API文檔

来源:https://www.cnblogs.com/peterzhang123/archive/2020/06/03/13036489.html
-Advertisement-
Play Games

參考文檔: https://www.cnblogs.com/liaods/p/10101513.html https://www.cnblogs.com/zyz-Notes/p/12030281.html 本示例使用MVC項目做演示(不推薦,推薦直接用WebAPI),框架版本使用 4.6.2 為了支 ...


參考文檔:

https://www.cnblogs.com/liaods/p/10101513.html

https://www.cnblogs.com/zyz-Notes/p/12030281.html

 

本示例使用MVC項目做演示(不推薦,推薦直接用WebAPI),框架版本使用 4.6.2 

為了支持WebAPI,我們需要把當前的MVC項目改造一下,右鍵項目,通過 Nuget添加WebAPI的支持

 

在 App_Start 文件夾下添加 WebApiConfig 類

 1     public class WebApiConfig
 2     {
 3         public static void Register(HttpConfiguration config)
 4         {
 5             // Web API 配置和服務
 7             // Web API 路由
 8             config.MapHttpAttributeRoutes();
 9 
10             config.Routes.MapHttpRoute(
11                 name: "DefaultApi",
12                 routeTemplate: "api/{controller}/{action}/{id}",
13                 defaults: new { id = RouteParameter.Optional }
14             );
17             var jsonFormatter = new JsonMediaTypeFormatter();
20             //jsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
23         }
24     }

然後在全局中註冊改文件,代碼放到第二行,接下來就可以使用了

右鍵項目安裝: Swashbuckle   版本 5.6.0

 

安裝成功之後,在App_Start文件夾下多了一個文件:SwaggerConfig.cs

 

 打開全局視圖 _Layout.cshtml,在裡邊添加一個鏈接:

<li>@Html.ActionLink("Swagger Help", "", "Swagger", new { area = "" }, null)</li>

直接運行,效果如下:

添加一個測試介面,UserInfoController

 1     public class UserInfoController : BaseController
 2     {
 3         /// <summary>
 4         ///  GET: 用戶信息首頁介面
 5         /// </summary>
 6         /// <remarks>
 7         /// 我是備註信息
 8         /// </remarks>
 9         /// <returns>我是返回信息</returns>
10         [HttpGet]
11         public IHttpActionResult Index()
12         {
13             return Json("Hello World");
14         }
15     }

如下圖所示,介面顯示出來了,但都是英文,備註信息也沒有顯示出來,後邊解決

 

 點擊按鈕: “Try It out”,會返回該介面內容

接下來,我們解決備註不顯示的問題,項目右鍵-->屬性,在 生成 選項卡中勾選 xml文檔文件選項。

然後打開 SwaggerConfig.cs 類,找到函數: c.IncludeXmlComments(GetXmlCommentsPath()) ,放開該行代碼註釋

並添加方法:GetXmlCommentsPath()

        /// <summary>
        /// 獲取文檔路徑
        /// </summary>
        /// <returns></returns>
        static string GetXmlCommentsPath()
        {
            return $@"{System.AppDomain.CurrentDomain.BaseDirectory}\bin\Swagger.Mvc.xml";
        }

現在註釋信息顯示出來了,但是其他的地方還是英文

 添加漢化支持,添加自定義漢化腳本,右鍵項目,添加文件夾 Swagger,添加js腳本文件 swagger_lang.js,右鍵該腳本文件,在屬性中的生成操作改為嵌入的資源

 

複製如下腳本:

///<summary>
/// 中文轉換
///</summary>
var SwaggerTranslator = (function () {
    //定時執行檢測是否轉換成中文,最多執行500次  即500*50/1000=25s
    var iexcute = 0,
        //中文語言包
        _words = {
            "Warning: Deprecated": "警告:已過時",
            "Implementation Notes": "實現備註",
            "Response Class": "響應類",
            "Status": "狀態",
            "Parameters": "參數",
            "Parameter": "參數",
            "Value": "值",
            "Description": "描述",
            "Parameter Type": "參數類型",
            "Data Type": "數據類型",
            "Response Messages": "響應消息",
            "HTTP Status Code": "HTTP狀態碼",
            "Reason": "原因",
            "Response Model": "響應模型",
            "Request URL": "請求URL",
            "Response Body": "響應體",
            "Response Code": "響應碼",
            "Response Headers": "響應頭",
            "Hide Response": "隱藏響應",
            "Headers": "頭",
            "Try it out!": "試一下!",
            "Show/Hide": "顯示/隱藏",
            "List Operations": "顯示操作",
            "Expand Operations": "展開操作",
            "Raw": "原始",
            "can't parse JSON.  Raw result": "無法解析JSON. 原始結果",
            "Model Schema": "模型架構",
            "Model": "模型",
            "apply": "應用",
            "Username": "用戶名",
            "Password": "密碼",
            "Terms of service": "服務條款",
            "Created by": "創建者",
            "See more at": "查看更多:",
            "Contact the developer": "聯繫開發者",
            "api version": "api版本",
            "Response Content Type": "響應Content Type",
            "fetching resource": "正在獲取資源",
            "fetching resource list": "正在獲取資源列表",
            "Explore": "瀏覽",
            "Show Swagger Petstore Example Apis": "顯示 Swagger Petstore 示例 Apis",
            "Can't read from server.  It may not have the appropriate access-control-origin settings.": "無法從伺服器讀取。可能沒有正確設置access-control-origin。",
            "Please specify the protocol for": "請指定協議:",
            "Can't read swagger JSON from": "無法讀取swagger JSON於",
            "Finished Loading Resource Information. Rendering Swagger UI": "已載入資源信息。正在渲染Swagger UI",
            "Unable to read api": "無法讀取api",
            "from path": "從路徑",
            "Click to set as parameter value": "點擊設置參數",
            "server returned": "伺服器返回"
        },

        //定時執行轉換
        _translator2Cn = function () {
            if ($("#resources_container .resource").length > 0) {
                _tryTranslate();
            }

            if ($("#explore").text() == "Explore" && iexcute < 500) {
                iexcute++;
                setTimeout(_translator2Cn, 50);
            }
        },

        //設置控制器註釋
        _setControllerSummary = function () {
            $.ajax({
                type: "get",
                async: true,
                url: $("#input_baseUrl").val(),
                dataType: "json",
                success: function (data) {
                    var summaryDict = data.ControllerDesc;
                    var id, controllerName, strSummary;
                    $("#resources_container .resource").each(function (i, item) {
                        id = $(item).attr("id");
                        if (id) {
                            controllerName = id.substring(9);
                            strSummary = summaryDict[controllerName];
                            if (strSummary) {
                                $(item).children(".heading").children(".options").prepend('<li class="controller-summary" title="' + strSummary + '">' + strSummary + '</li>');
                            }
                        }
                    });
                }
            });
        },

        //嘗試將英文轉換成中文
        _tryTranslate = function () {
            $('[data-sw-translate]').each(function () {
                $(this).html(_getLangDesc($(this).html()));
                $(this).val(_getLangDesc($(this).val()));
                $(this).attr('title', _getLangDesc($(this).attr('title')));
            });
        },
        _getLangDesc = function (word) {
            return _words[$.trim(word)] !== undefined ? _words[$.trim(word)] : word;
        };

    return {
        Translator: function () {
            document.title = "API描述文檔";
            $('body').append('<style type="text/css">.controller-summary{color:#10a54a !important;word-break:keep-all;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:250px;text-align:right;cursor:default;} </style>');
            $("#logo").html("介面描述").attr("href", "/Home/Index");
            //設置控制器描述
            _setControllerSummary();
            _translator2Cn();
        }
    }
})();
//執行轉換
SwaggerTranslator.Translator();

打開 SwaggerConfig.cs 類 ,找到函數:InjectJavaScript,並修改成上邊自定義的js文件路徑,格式用點分開

c.InjectJavaScript(thisAssembly, "Swagger.Mvc.Swagger.swagger_lang.js");

添加控制器描述和介面文檔緩存

 1 public class CachingSwaggerProvider : ISwaggerProvider
 2     {
 3         private static ConcurrentDictionary<string, SwaggerDocument> _cache =
 4             new ConcurrentDictionary<string, SwaggerDocument>();
 5 
 6         private readonly ISwaggerProvider _swaggerProvider;
 7 
 8         public CachingSwaggerProvider(ISwaggerProvider swaggerProvider)
 9         {
10             _swaggerProvider = swaggerProvider;
11         }
12 
13         public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
14         {
15             var cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion);
16             SwaggerDocument srcDoc = null;
17             //只讀取一次
18             if (!_cache.TryGetValue(cacheKey, out srcDoc))
19             {
20                 srcDoc = _swaggerProvider.GetSwagger(rootUrl, apiVersion);
21 
22                 srcDoc.vendorExtensions = new Dictionary<string, object> { { "ControllerDesc", GetControllerDesc() } };
23                 _cache.TryAdd(cacheKey, srcDoc);
24             }
25             return srcDoc;
26         }
27 
28         /// <summary>
29         /// 從API文檔中讀取控制器描述
30         /// </summary>
31         /// <returns>所有控制器描述</returns>
32         public static ConcurrentDictionary<string, string> GetControllerDesc()
33         {
34             string xmlpath = string.Format("{0}/bin/Swagger.Mvc.xml", System.AppDomain.CurrentDomain.BaseDirectory);
35             ConcurrentDictionary<string, string> controllerDescDict = new ConcurrentDictionary<string, string>();
36             if (File.Exists(xmlpath))
37             {
38                 XmlDocument xmldoc = new XmlDocument();
39                 xmldoc.Load(xmlpath);
40                 string type = string.Empty, path = string.Empty, controllerName = string.Empty;
41 
42                 string[] arrPath;
43                 int length = -1, cCount = "Controller".Length;
44                 XmlNode summaryNode = null;
45                 foreach (XmlNode node in xmldoc.SelectNodes("//member"))
46                 {
47                     type = node.Attributes["name"].Value;
48                     if (type.StartsWith("T:"))
49                     {
50                         //控制器
51                         arrPath = type.Split('.');
52                         length = arrPath.Length;
53                         controllerName = arrPath[length - 1];
54                         if (controllerName.EndsWith("Controller"))
55                         {
56                             //獲取控制器註釋
57                             summaryNode = node.SelectSingleNode("summary");
58                             string key = controllerName.Remove(controllerName.Length - cCount, cCount);
59                             if (summaryNode != null && !string.IsNullOrEmpty(summaryNode.InnerText) && !controllerDescDict.ContainsKey(key))
60                             {
61                                 controllerDescDict.TryAdd(key, summaryNode.InnerText.Trim());
62                             }
63                         }
64                     }
65                 }
66             }
67             return controllerDescDict;
68         }
69 
70 
71     }

在SwaggerConfig.cs 類 中放開註釋代碼:

c.CustomProvider((defaultProvider) => new CachingSwaggerProvider(defaultProvider));

再次運行程式後,現在變成中的了。

備註內容換行,在相應備註後邊加 <br></br>即可出現換行,換行標簽要成對出現,否則會報錯

 

最後運行效果如下:

 

 

 

 

 

總結:

最後有個問題,就是項目名稱中間不能用點來分割,比如: Swagger.Mvc 這樣就不行,這樣的名字,上邊漢化時會找不到路徑。所以需要把中間的點去掉,坑啊!


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

-Advertisement-
Play Games
更多相關文章
  • 一.瀏覽器內核太撈了一般人都會避開他 from selenium.webdriver import Chrome from selenium.webdriver import ChromeOptions option = ChromeOptions() option.add_experimental ...
  • spring註入map,spring註入一個介面的多個實現類在map里 ...
  • 轉載https://www.jianshu.com/p/5d27888e7c93#!/xh #!/usr/bin/env python # -*- coding=utf-8 -*- """ AES加密解密工具類 @author jzx @date 2018/10/24 此工具類加密解密結果與 htt ...
  • 什麼是sam 轉換 Single Abstract Method 實際上這是java8中提出的概念,你就把他理解為是一個方法的介面的就可以了 看一下我們每天都在使用的線程池 ExecutorService executorService= Executors.newScheduledThreadPo ...
  • 結合 AOP 輕鬆處理事件發佈處理日誌 Intro 前段時間,實現了 EventBus 以及 EventQueue 基於 Event 的事件處理,但是沒有做日誌(EventLog)相關的部分,原本想增加兩個介面, 處理事件發佈日誌和事件處理日誌,最近用了 AOP 的思想處理了 EntityFrame ...
  • Microsoft.AspNetCore.Mvc.Versioning //引入程式集 .net core 下麵api的版本控製作用不需要多說,可以查閱https://www.cnblogs.com/dc20181010/p/11313738.html 普通的版本控制一般是通過鏈接、header此類 ...
  • 系列文章 基於 abp vNext 和 .NET Core 開發博客項目 - 使用 abp cli 搭建項目 基於 abp vNext 和 .NET Core 開發博客項目 - 給項目瘦身,讓它跑起來 基於 abp vNext 和 .NET Core 開發博客項目 - 完善與美化,Swagger登場 ...
  • 引用NModbus 在NuGet搜索NModbus,添加引用。 封裝ModbusTcp類 public class ModbusTCP { private ModbusFactory modbusFactory; private IModbusMaster master; private TcpCl ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...