從0到1手把手教你ASP.NET Core Web API專案配置介面文件Swagger(二)

張歐昊辰發表於2023-04-12

傳送門:從0到1手把手教你ASP.NET Core Web API專案配置介面文件Swagger(一)

一、設定Swagger頁面為首頁——開發環境

我們雖然可以在輸入 /swagger 後順利的訪問 Swagger UI 頁面,但是我們發現每次執行專案都會預設訪問 /weatherforecast 這個介面,想要將啟動頁設為 /swagger (或者其他頁面)就需要用到配置檔案 launchSettings.json。

在如下圖中所示的位置找到並開啟 launchSettings.json 檔案,在如下圖中所示的地方修改“launchUrl”屬性(有該屬性則修改,無該屬性則手動新增)的值由“weatherforecast”為“swagger”並儲存,再一次按 F5 鍵執行專案就會發現直接訪問的地址為“https://localhost:44390/swagger”。

二、設定Swagger頁面為首頁——生產環境

上述方法在本地除錯可以直接執行,但是如果部署到伺服器,就會發現之前的那種預設啟動首頁無效了,還是需要每次手動在域名後邊輸入“/swagger”。

幸運的是,Swagger 提供了一個擴充套件,可以指定一個空字元作為 Swagger 的地址。在 Startup.cs 檔案的 Startup 類的 Configure 方法中配置中介軟體,如下圖所示,程式碼如下所示。

            #region Swagger
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/DocV1/swagger.json", "DocV1");//此為之前配置內容
                c.RoutePrefix = "";//此為本次新增配置項
            });
            #endregion

然後把配置檔案 launchSettings.json 的 launchUrl 屬性註釋或刪除,如下圖所示,這樣無論是本地開發環境還是生產環境,都可以預設載入 Swagger UI 頁面了。

三、新增註釋

1、給介面新增註釋

首先給介面方法加上註釋:開啟預設生成的 WeatherForecast 控制器,分別給控制器和介面新增註釋,程式碼如下所示。

    /// <summary>
    /// 天氣預報
    /// </summary>
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        /// <summary>
        /// 獲取天氣
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }

新增好註釋之後,接下來就需要把註釋資訊顯示在 Swagger 中,這時候需要用到 XML 文件,因為它是透過 XML 來維護 Swagger 文件的一些資訊。

滑鼠右鍵單擊專案名稱,在彈出的選單中選擇“屬性”選項,在屬性選項卡頁面中的“生成”選項的“輸出”選項的“文件檔案”選項下,勾選“生成包含API文件的檔案”選擇框,“XML 文件檔案路徑”此處使用預設位置,故保留為空,如下圖所示。

重新編譯專案後,系統會在 bin\Debug\net5.0 路徑下預設生成一個與專案名稱相同的 XML 檔案,前後對比如下圖所示。

接下來修改 Swagger 服務注入的程式碼。在 Startup.cs 檔案的 Startup 類的 ConfigureServices 方法中進行修改,程式碼如下所示。

            #region Swagger
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("DocV1", new OpenApiInfo
                {
                    Version = "v0.1.0",
                    Title = "ZOHC測試文件",
                    Description = "一個Swagger教程文件",
                    Contact = new OpenApiContact
                    {
                        Name = "張歐昊辰",
                        Email = "izohc@foxmail.com"

                    }
                });


                #region 新增註釋新增內容
                var basePath = AppContext.BaseDirectory;
                var projectName = AppDomain.CurrentDomain.FriendlyName;
                var xmlPath = Path.Combine(basePath, projectName + ".xml");
                c.IncludeXmlComments(xmlPath, true);
                #endregion

            });
            #endregion

然後按 F5 啟動專案,這樣控制器和介面註釋就都有了,前後對比效果如下圖所示。

2、給Model新增註釋

新建一個類庫,取名為“AllTestDemo.Model”,步驟如下圖所示,不再做過多文字敘述。

當類庫建立成功後,我們將“AllTestDemo”下的“WeatherForecast.cs”檔案移動到新建的類庫“AllTestDemo.Model”下,修改名稱空間並新增上註釋,如下圖所示。

我們按照上一小節中給“AllTestDemo”新增 XML 文件的方法,同樣給“AllTestDemo.Model”新增 XML 文件。然後回到 Startup.cs 檔案的 Startup 類的 ConfigureServices 方法中進行修改,程式碼如下所示。

                var xmlModelPath = Path.Combine(basePath, "AllTestDemo.Model.xml");
                c.IncludeXmlComments($"{xmlModelPath}", true);

重新編譯專案後,按 F5 啟動專案,這樣 Model 註釋就有了,前後對比效果如下圖所示。

四、去掉 Swagger 警告提示

新增 Swagger 包之後,控制器不填寫相應的註釋,專案會有很多警告,開啟錯誤列表檢視,如下圖所示。

如果我們不想新增註釋,又不想看到這個警告提示,可以這樣做。

開啟“AllTestDemo”的屬性皮膚,在“生成”選項的“錯誤和警告”選項的“取消顯示警告”選項下,新增“;1591”並儲存,注意1591前面有分號且是英文輸入法狀態下輸入的,如下圖所示。

“重新生成解決方案”後,我們看到錯誤列表中“AllTestDemo”專案下的警告已經沒有了,仍然能看到“AllTestDemo.Model”專案下的警告資訊,如下圖所示。

我們可按照上述同樣的方法,對“AllTestDemo.Model”進行相同的處理即可。

五、忽略介面資訊

如果我們不想展示某個控制器中全部或部分介面的資訊,可以在 Controller  上或者 Action 上新增 [ApiExplorerSettings(IgnoreApi = true)] 特性來忽略。

1、不新增特性

為了展示效果,在 WeatherForecastController 中新增了一個 POST 訪問型別的方法,程式碼如下所示。

        [HttpPost]
        public void Index()
        {
        }

此時 Swagger UI 顯示結果如下圖所示。

2、在 Action 上新增特性

我們在系統自動生成的 Get 方法上新增 [ApiExplorerSettings(IgnoreApi = true)] 特性,如下圖所示。

按 F5 鍵專案啟動後 Swagger UI 顯示如下圖所示,對比不新增特性的顯示結果,我們發現 Get 型別的方法未展示。

3、在 Controller 上新增特性

我們在系統自動生成的 WeatherForecastController 上新增 [ApiExplorerSettings(IgnoreApi = true)] 特性,如下圖所示。

按 F5 鍵專案啟動後 Swagger UI 顯示如下圖所示,對比不新增特性的顯示結果,我們發現沒有介面資訊展示。

-------------------------------本篇文章到此結束-------------------------------------

相關文章