主頁 > .NET開發 > NetCore 3.0 中使用Swagger生成Api說明檔案及升級報錯原因

NetCore 3.0 中使用Swagger生成Api說明檔案及升級報錯原因

2020-09-19 18:54:18 .NET開發

認識Swagger

Swagger 是一個規范和完整的框架,用于生成、描述、呼叫和可視化 RESTful 風格的 Web 服務,總體目標是使客戶端和檔案系統作為服務器以同樣的速度來更新,檔案的方法,引數和模型緊密集成到服務器端的代碼,允許API來始終保持同步,
作用:

    1. 介面的檔案在線自動生成,
    2. 功能測驗,

為什么使用Swagger作為REST APIs檔案生成工具

  1. Swagger 可以生成一個具有互動性的API控制臺,開發者可以用來快速學習和嘗試API,
  2. Swagger 可以生成客戶端SDK代碼用于各種不同的平臺上的實作,
  3. Swagger 檔案可以在許多不同的平臺上從代碼注釋中自動生成,
  4. Swagger 有一個強大的社區,里面有許多強悍的貢獻者,

安裝Nuget包搜索Swashbuckle.AspNetCore

因為是.NetCore3.0 ,所以一定要勾選包括預覽發行版,安裝最新預發行版 5.0.0-rc4,千萬不要安裝最新穩定版,穩定版會報錯,
穩定版報錯資訊:

1 Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType:
2 Swashbuckle.AspNetCore.Swagger.ISwaggerProvider Lifetime: Transient ImplementationType:
3 Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator': Failed to compare two elements in the array.)
4 (Error while validating the service descriptor 'ServiceType: Swashbuckle.AspNetCore.SwaggerGen.ISchemaRegistryFactory Lifetime:
5 Transient ImplementationType: Swashbuckle.AspNetCore.SwaggerGen.SchemaRegistryFactory': Failed to compare two elements in the array.)

解決辦法就是3.0版本中要安裝現在預覽發行版5.0.0-rc4

在.NetCore3.0中 配置Swagger 也發生變化,
由以前的

1 services.AddSwaggerGen(c =>
2 {
3   c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
4 });

變更為

1 services.AddSwaggerGen(c =>
2  {
3        c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
4  });

其中最大的變化就是Info這里,在以前2.0版本中是由Swagger來管理的,在3.0版本中統一變更為 OpenApi管理,OpenApi 在官方檔案中介紹為是用于管理專案內 OpenAPI 參考的 .NET Core 全域工具,

參考地址:(https://docs.microsoft.com/zh-cn/aspnet/core/web-api/microsoft.dotnet-openapi?view=aspnetcore-3.1 "使用 OpenAPI 工具開發 ASP.NET Core 應用")

所以在添加完Swagger 包后,還要在專案中添加Microsoft.OpenApi包

注冊Swagger

 1 public void ConfigureServices(IServiceCollection services)
 2 {
 3 
 4 services.AddControllers();
 5 
 6 services.AddSwaggerGen(c =>
 7 {
 8 c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
 9 });
10 
11 }

配置Swagger UI

 1 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
 2 {
 3 if (env.IsDevelopment())
 4 {
 5 app.UseDeveloperExceptionPage();
 6 }
 7 app.UseHttpsRedirection();
 8 app.UseRouting();
 9 app.UseAuthorization();
10 //啟用Swagger
11 app.UseSwagger();
12 //配置Swagger UI
13 app.UseSwaggerUI(c =>
14 {
15 c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API"); //注意中間段v1要和上面SwaggerDoc定義的名字保持一致
16 });
17 app.UseEndpoints(endpoints =>
18 {
19 endpoints.MapControllers();
20 });
21 }

啟動專案

CTRL+F5啟動專案,并導航到 http://localhost:port/swagger 通過Swagger UI游覽API檔案

Swagger的高級用法(自定義擴展)

在 AddSwaggerGen 方法的進行如下的配置操作會添加諸如作者、許可證和說明資訊等:

 1 services.AddSwaggerGen(c =>
 2  {
 3            c.SwaggerDoc("v1", new OpenApiInfo
 4             {
 5                     Title = "My API",
 6                     Version = "v1",
 7                     Description = "API檔案描述",
 8                     Contact = new OpenApiContact
 9                     {
10                         Email = "[email protected]",
11                         Name = "開源NetCore",
12                         Url = new Uri("http://www.netcore.pub/")
13                     },
14                     License = new OpenApiLicense
15                     {
16                         Name = "許可證名稱",
17                         Url = new Uri("http://www.netcore.pub/")
18                     }
19             });
20  });

Swagger UI 顯示版本的資訊如下圖所示

為API介面方法添加注釋

大家先點開API,展開如下圖所示,可是沒有注釋呀,怎么添加注釋呢?

按照下列代碼所示用三個/添加檔案注釋,如下所示

 1 /// <summary>
 2 /// 這是一個API注釋
 3 /// </summary>
 4 /// <returns></returns>
 5 [HttpGet]
 6 public IEnumerable<WeatherForecast> Get()
 7  {
 8             var rng = new Random();
 9             return Enumerable.Range(1, 5).Select(index => new WeatherForecast
10             {
11                 Date = DateTime.Now.AddDays(index),
12                 TemperatureC = rng.Next(-20, 55),
13                 Summary = Summaries[rng.Next(Summaries.Length)]
14             })
15             .ToArray();
16 }

然后運行專案,回到Swagger UI中去查看注釋是否出現了呢

還是沒出現?一臉懵逼??? 別急往下看!

啟用XML注釋

可使用以下方法啟用 XML 注釋:

右鍵單擊“解決方案資源管理器”中的專案,然后選擇“屬性”
查看“生成”選項卡的“輸出”部分下的“XML 檔案檔案”框

啟用 XML 注釋后會為未記錄的公共型別和成員提供除錯資訊,如果出現很多警告資訊 例如,以下訊息指示違反警告代碼 1591:

1 warning CS1591: Missing XML comment for publicly visible type or member 'TodoController.GetAll()'

如果你有強迫癥,想取消警告怎么辦呢?可以按照下圖所示進行取消

注意上面生成的xml檔案檔案的路徑,

注意:

? 1.對于 Linux 或非 Windows 作業系統,檔案名和路徑區分大小寫, 例如,“Kylin.Wiki.xml”檔案在 Windows 上有效,但在 CentOS 上無效,

? 2.獲取應用程式路徑,建議采用Path.GetDirectoryName(typeof(Program).Assembly.Location)這種方式或者·AppContext.BaseDirectory這樣來獲取

 1 services.AddSwaggerGen(c =>
 2             {
 3                 c.SwaggerDoc("v1", new OpenApiInfo
 4                 {
 5                     Title = "My API",
 6                     Version = "v1",
 7                     Description = "API檔案描述",
 8                     Contact = new OpenApiContact
 9                     {
10                         Email = "[email protected]",
11                         Name = "開源NetCore",
12                         Url = new Uri("http://www.netcore.pub/")
13                     },
14                     License = new OpenApiLicense
15                     {
16                         Name = "許可證名稱",
17                         Url = new Uri("http://www.netcore.pub/")
18                     }
19                 });
20                 // 為 Swagger JSON and UI設定xml檔案注釋路徑
21                 var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);//獲取應用程式所在目錄(絕對,不受作業目錄影響,建議采用此方法獲取路徑)
22                 var xmlPath = Path.Combine(basePath, "Kylin.Wiki.xml");
23                 c.IncludeXmlComments(xmlPath);
24  });

重新生成并運行專案查看一下注釋出現了沒有

通過上面的操作可以總結出,Swagger UI 顯示上述注釋代碼的元素的內部文本作為api大的注釋!

當然你還可以將 remarks 元素添加到 Get 操作方法檔案, 它可以補充元素中指定的資訊,并提供更可靠的 Swagger UI, 元素內容可包含文本、JSON 或 XML, 代碼如下:

 1 /// <summary>
 2 /// 這是一個帶引數的get請求
 3 /// </summary>
 4 /// <remarks>
 5 /// 例子:
 6 /// Get api/Values/1
 7 /// </remarks>
 8 /// <param name="id">主鍵</param>
 9 /// <returns>測驗字串</returns>    
10 public ActionResult<string> Get(int id)
11 {
12       return $"你請求的 id 是 {id}";
13 }

重新生成下專案,當好到SwaggerUI看到如下所示:

描述回應型別

介面使用者最關心的就是介面的回傳內容和回應型別啦,下面展示一下201和400狀態碼的一個簡單例子:

我們需要在我們的方法上添加:

[ProducesResponseType(201)]

[ProducesResponseType(400)]

然后添加相應的狀態說明:回傳value字串如果id為空

最終代碼應該是這個樣子:

 1  /// <summary>
 2  /// 這是一個帶引數的get請求
 3  /// </summary>
 4  /// <remarks>
 5  /// 例子:
 6  /// Get api/Values/1
 7  /// </remarks>
 8  /// <param name="id">主鍵</param>
 9  /// <returns>測驗字串</returns>
10  /// <response code="201">回傳value字串</response>
11 /// <response code="400">如果id為空</response>  
12  // GET api/values/2
13 [HttpGet("{id}")]
14 [ProducesResponseType(201)]
15 [ProducesResponseType(400)]
16 public ActionResult<string> Get(int id)
17 {
18      return $"你請求的 id 是 {id}";
19 }

效果如下所示
狀態相應效果

使用SwaggerUI測驗api介面

下面我們通過一個小例子通過SwaggerUI除錯下介面吧

點擊一個需要測驗的API介面,然后點擊Parameters左右邊的“Try it out ” 按鈕
在出現的引數文本框中輸入引數,如下圖所示的,輸入引數2
點擊執行按鈕,會出現下面所示的格式化后的Response,如下圖所示

好了,今天的在ASP.NET Core WebApi 3.0 中使用Swagger生成api說明檔案教程就到這里了,希望能夠對大家學習在ASP.NET Core中使用Swagger生成api檔案有所幫助!

「開源NetCore,如果覺得我的文章對您有用,請幫助本站成長」 

 

除非注明,文章均由開源 NetCore 整理發布,歡迎轉載,

轉載請注明本文地址:http://www.netcore.pub/167.html

站長會將優質文章在各大平臺同步更新、推送,歡迎大家訪問、訂閱:

博客園: https://www.cnblogs.com/Zenderblogs/

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/83039.html

標籤:.NET Core

上一篇:asp.net core中間件作業原理

下一篇:.NET Core 3終結點不能映射控制器

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more