学习:基本使用、终结点配置、xml注释启用等

master
bicijinlian 4 years ago
parent af707427da
commit 0c8ae28efa

@ -2,6 +2,8 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);1591</NoWarn>
</PropertyGroup>
</Project>

@ -2,6 +2,8 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);1591</NoWarn>
</PropertyGroup>
</Project>

@ -2,6 +2,8 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);1591</NoWarn>
</PropertyGroup>
<ItemGroup>

@ -1,23 +1,23 @@
| **警告:** 如果您要在主要版本之间迁移,请特别注意。
| :mega: Important notice if you're upgrading between major versions! |
|--------------|
|* 从 4.x 升级到 5.x需要注意几个重大更改查看[发行说明](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases/tag/v5.0.0) <br />* 先从3.x 升级到4.x,也有很多乌龙,查看 [发行说明](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases/tag/v4.0.0)|
|* If you're upgrading from 4.x to 5.x, there's several breaking changes to be aware of. See the [release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases/tag/v5.0.0) for details<br />* If you're making the jump from 3.x to 4.x first, there be dragons there too. See [those release notes here](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases/tag/v4.0.0)|
Swashbuckle.AspNetCore
========
=========
[![构建状态](Images/Master.svg)](https://ci.appveyor.com/project/domaindrivendev/ahoy/branch/master)
[![Build status](https://ci.appveyor.com/api/projects/status/xpsk2cj1xn12c0r7/branch/master?svg=true)](https://ci.appveyor.com/project/domaindrivendev/ahoy/branch/master)
[![Nuget](Images/aspnetcore.svg)](https://www.nuget.org/packages/swashbuckle.aspnetcore/)
[![Nuget](https://img.shields.io/nuget/v/swashbuckle.aspnetcore)](https://www.nuget.org/packages/swashbuckle.aspnetcore/)
[Swagger](http://swagger.io) 为使用ASP.NET Coer构建API的工具。直接从您的路由、控制器和模型生成漂亮的API文档包括用于探索和测试操作的UI。
[Swagger](http://swagger.io) tooling for API's built with ASP.NET Core. Generate beautiful API documentation, including a UI to explore and test operations, directly from your routes, controllers and models.
除[Swagger 2.0 and OpenAPI 3.0](http://swagger.io/specification/) 之外, Swashbuckle还提供了由Swagger JSON驱动的超棒的嵌入式swagger-ui。
In addition to its [Swagger 2.0 and OpenAPI 3.0](http://swagger.io/specification/) generator, Swashbuckle also provides an embedded version of the awesome [swagger-ui](https://github.com/swagger-api/swagger-ui) that's powered by the generated Swagger JSON. This means you can complement your API with living documentation that's always in sync with the latest code. Best of all, it requires minimal coding and maintenance, allowing you to focus on building an awesome API.
这还不是全部 ......
And that's not all ...
一旦有了可以在Swagger中描述自己的API就可以使用基于Swagger的工具库其中包括可以针对各种流行平台的客户端生成器。详细情况参见 [swagger-codegen](https://github.com/swagger-api/swagger-codegen)
Once you have an API that can describe itself in Swagger, you've opened the treasure chest of Swagger-based tools including a client generator that can be targeted to a wide range of popular platforms. See [swagger-codegen](https://github.com/swagger-api/swagger-codegen) for more details.
# 兼容性 #
# Compatibility #
|Swashbuckle Version|ASP.NET Core|Swagger / OpenAPI Spec.|swagger-ui|ReDoc UI|
|----------|----------|----------|----------|----------|
@ -27,16 +27,16 @@ Swashbuckle.AspNetCore
|[3.0.0](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/tree/v3.0.0)|>= 1.0.4, < 3.0.0|2.0|3.17.1|1.20.0|
|[2.5.0](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/tree/v2.5.0)|>= 1.0.4, < 3.0.0|2.0|3.16.0|1.20.0|
# 入门 #
# Getting Started #
1. 安装 Nuget包到您的ASP.NET Core应用程序中。
1. Install the standard Nuget package into your ASP.NET Core application.
```
Nuget包管理器命令: Install-Package Swashbuckle.AspNetCore -Version 5.6.2
.Net Core CLI: dotnet add package --version 5.6.2 Swashbuckle.AspNetCore
Package Manager : Install-Package Swashbuckle.AspNetCore -Version 5.6.2
CLI : dotnet add package --version 5.6.2 Swashbuckle.AspNetCore
```
2. `Startup.cs`类的`ConfigureServices`方法内注册Swagger生成器定义一个或多个Swagger文档。
2. In the `ConfigureServices` method of `Startup.cs`, register the Swagger generator, defining one or more Swagger documents.
```csharp
using Microsoft.OpenApi.Models;
@ -51,7 +51,7 @@ Swashbuckle.AspNetCore
});
```
3. 确保使用显式的"Http"特性和"From"绑定装饰您的API方法和参数。
3. Ensure your API actions and parameters are decorated with explicit "Http" and "From" bindings.
```csharp
[HttpPost]
@ -65,17 +65,17 @@ Swashbuckle.AspNetCore
...
```
_注意:如果您省略显式参数绑定,则默认情况下,生成器会将其描述为"query"参数。__
_NOTE: If you omit the explicit parameter bindings, the generator will describe them as "query" params by default._
4. 在该Configure方法中插入中间件以将生成的Swagger公开为JSON端点
4. In the `Configure` method, insert middleware to expose the generated Swagger as JSON endpoint(s)
```csharp
app.UseSwagger();
```
_此时,您可以启动应用程序,并在“ /swagger/v1/swagger.json”中查看生成的Swagger JSON。_
_At this point, you can spin up your application and view the generated Swagger JSON at "/swagger/v1/swagger.json."_
5. 可选的如果您想公开交互式文档请插入swagger-ui中间件并指定Swagger JSON端点作为提供器。
5. Optionally, insert the swagger-ui middleware if you want to expose interactive documentation, specifying the Swagger JSON endpoint(s) to power it from.
```csharp
app.UseSwaggerUI(c =>
@ -84,17 +84,17 @@ Swashbuckle.AspNetCore
});
```
_现在,您可以重新启动应用程序,并在“ / swagger”处签出自动生成的交互式文档。_
_Now you can restart your application and check out the auto-generated, interactive docs at "/swagger"._
# System.Text.Json (STJ) vs Newtonsoft #
5.0.0以前的版Swashbuckle基于Newtonsoft序列化器来生成Schema(由API公开的数据类型的描述),那是因为当时的ASP.NET程序以Newtonsoft为默认的序列化器。但是从开始ASP.NET Core 3.0.0版本开始ASP.NET Core开箱即用地引入了新的默认的序列化程序System.Text.JsonSTJ并且如果您想继续使用Newtonsoft则需要安装一个单独的程序包并明确选择加入。 从Swashbuckle `5.0.0` 开始使用与asp.net core相同的策略. 也就是说开箱即用的Swashbuckle会假设您正在使用STJ序列化器并根据其行为生成Schema。如果您使用的是Newtonsoft那么您需要安装一个单独的Swashbuckle软件包并明确选择加入。 **无论您使用的是哪个版本的ASP.NET Core这都是必需的步骤**.
In versions prior to `5.0.0`, Swashbuckle will generate Schema's (descriptions of the data types exposed by an API) based on the behavior of the *Newtonsoft* serializer. This made sense because that was the serializer that shipped with ASP.NET Core at the time. However, since version `3.0.0`, ASP.NET Core introduces a new serializer *System.Text.Json (STJ)* out-of-the-box, and if you want to continue using *Newtonsoft*, you need to install a separate package and explicitly opt-in. From Swashbuckle `5.0.0` and beyond a similar pattern is used. That is, out-of-the-box Swashbuckle will assume you're using the *STJ* serializer and generate Schema's based on it's behavior. If you're using *Newtonsoft*, then you'll need to install a separate Swashbuckle package and explicitly opt-in. **This is a required step, regardless of which version of ASP.NET Core you're using**.
综上所述
In summary ...
如果您使用的是System.Text.JsonSTJ那么上述设置就足够了并且Swagger生成器将自动接受STJ选项/属性。
If you're using **System.Text.Json (STJ)**, then the setup described above will be sufficient, and *STJ* options/attributes will be automatically honored by the Swagger generator.
如果您使用的是Newtonsoft那么您需要安装一个单独的软件包并明确选择加入以确保Swagger生成器自动遵守Newtonsoft的**设置/属性**:
If you're using **Newtonsoft**, then you'll need to install a separate package and explicitly opt-in to ensure that *Newtonsoft* settings/attributes are automatically honored by the Swagger generator:
```
Package Manager : Install-Package Swashbuckle.AspNetCore.Newtonsoft -Version 5.6.2
@ -111,16 +111,16 @@ services.AddSwaggerGen(c =>
services.AddSwaggerGenNewtonsoftSupport(); // explicit opt-in - needs to be placed after AddSwaggerGen()
```
# Swashbuckle、ApiExplorer和Routing #
# Swashbuckle, ApiExplorer, and Routing #
Swashbuckle高度依赖ApiExplorerASP.NET Core附带的API元数据层。如果您使用AddMvc帮助程序来引导MVC堆栈则ApiExplorer将自动注册并且SB可以正常工作。但是如果AddMvcCore用于更配对的MVC堆栈则需要显式添加ApiExplorer服务
Swashbuckle relies heavily on `ApiExplorer`, the API metadata layer that ships with ASP.NET Core. If you're using the `AddMvc` helper to bootstrap the MVC stack, then ApiExplorer will be automatically registered and SB will work without issue. However, if you're using `AddMvcCore` for a more paired-down MVC stack, you'll need to explicitly add the ApiExplorer service:
```csharp
services.AddMvcCore()
.AddApiExplorer();
```
此外,如果您使用 _[常规路由](https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing#conventional-routing)_ 而不是属性路由则任何控制器以及使用常规路由的那些控制器上的操作都不会在ApiExplorer中表示这意味着Swashbuckle将无法找到那些控制器并生成Swagger他们的操作。例如
Additionally, if you are using _[conventional routing](https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing#conventional-routing)_ (as opposed to attribute routing), any controllers and the actions on those controllers that use conventional routing will not be represented in ApiExplorer, which means Swashbuckle won't be able to find those controllers and generate Swagger operations from them. For instance:
```csharp
app.UseMvc(routes =>
@ -130,7 +130,7 @@ app.UseMvc(routes =>
});
```
**必须** 对要在Swagger文档中表示的任何控制器使用属性路由:
You **must** use attribute routing for any controllers that you want represented in your Swagger document(s):
```csharp
[Route("example")]
@ -140,19 +140,19 @@ public class ExampleController : Controller
public IActionResult DoStuff() { /**/ }
}
```
有关更多信息,请参考 [路由文档](https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing) .
Refer to the [routing documentation](https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing) for more information.
# 组件 #
# Components #
Swashbuckle由多个组件组成可根据您的需要一起使用或单独使用。它的核心是Swagger生成器将其作为JSON端点公开的中间件以及 [swagger-ui](https://github.com/swagger-api/swagger-ui)的打包版本。这3个软件包可以与Swashbuckle.AspNetCore“元软件包”一起安装并且可以无缝地协同工作请参阅[入门](#getting-started)以提供从代码自动生成的精美API文档。
Swashbuckle consists of multiple components that can be used together or individually dependening on your needs. At its core, there's a Swagger generator, middleware to expose it as JSON endpoints, and a packaged version of the [swagger-ui](https://github.com/swagger-api/swagger-ui). These 3 packages can be installed with the `Swashbuckle.AspNetCore` "metapackage" and will work together seamlessly (see [Getting Started](#getting-started)) to provide beautiful API docs that are automatically generated from your code.
此外,还有附加软件包 ( CLI tools, [备用UI](https://github.com/Rebilly/ReDoc)),您可以根据需要选择安装和配置。
Additionally, there's add-on packages (CLI tools, [an alternate UI](https://github.com/Rebilly/ReDoc) etc.) that you can optionally install and configure as needed.
## “核心”软件包即通过Swashbuckle.AspNetCore安装
## "Core" Packages (i.e. installed via Swashbuckle.AspNetCore)
|Package|Description|
|---------|-----------|
|Swashbuckle.AspNetCore.Swagger|公开Swagger JSON端点。它期望将实现的`ISwaggerProvider`实现注册到DI容器中并对其进行查询以进行检索`OpenAPIDocument(s)`然后将其公开为序列化JSON。|
|Swashbuckle.AspNetCore.Swagger|Exposes Swagger JSON endpoints. It expects an implementation of `ISwaggerProvider` to be registered in the DI container, which it queries to retrieve `OpenAPIDocument(s)` that are then exposed as serialized JSON|
|Swashbuckle.AspNetCore.SwaggerGen|Injects an implementation of `ISwaggerProvider` that can be used by the above component. This particular implementation generates `OpenApiDocument(s)` from your routes, controllers and models|
|Swashbuckle.AspNetCore.SwaggerUI|Exposes an embedded version of the swagger-ui. You specify the API endpoints where it can obtain Swagger JSON, and it uses them to power interactive docs for your API|

File diff suppressed because it is too large Load Diff

@ -21,7 +21,20 @@ namespace SwaggerStudy
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.UseStartup<StartupTest>();
//webBuilder.UseStartup<Startup>();
//webBuilder.UseStartup<Startup01>();
//webBuilder.UseStartup<Startup02>();
//webBuilder.UseStartup<Startup03>();
//webBuilder.UseStartup<Startup04>();
//webBuilder.UseStartup<Startup05>();
//webBuilder.UseStartup<Startup06>();
//webBuilder.UseStartup<Startup07>();
//webBuilder.UseStartup<Startup08>();
//webBuilder.UseStartup<Startup09>();
//webBuilder.UseStartup<Startup10>();
//webBuilder.UseStartup<Startup11>();
//webBuilder.UseStartup<Startup12>();
});
}
}

@ -22,6 +22,9 @@ using Microsoft.OpenApi.Models;
namespace SwaggerStudy
{
/// <summary>
/// 未引入Swagger
/// </summary>
public class Startup
{
public Startup(IConfiguration configuration)
@ -40,12 +43,6 @@ namespace SwaggerStudy
jsonOption.JsonSerializerOptions.Converters.Add(new DatetimeJsonConverter());
jsonOption.JsonSerializerOptions.Encoder= System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All);
});
#region swagger
services.AddSwaggerGen(setup =>
{
setup.SwaggerDoc("GroupA", new OpenApiInfo { Title = "Swagger学习", Version = "第一版" });
});
#endregion
services.AddTransient<StudentServer>();
}
@ -57,13 +54,6 @@ namespace SwaggerStudy
app.UseDeveloperExceptionPage();
}
app.UseSwagger();
app.UseSwaggerUI(setup =>
{
setup.SwaggerEndpoint("/swagger/GroupA/swagger.json", "Swagger学习第一版");
});
app.UseRouting();
app.UseAuthorization();

@ -0,0 +1,80 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Swashbuckle;
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using Swashbuckle.AspNetCore.SwaggerUI;
using SwaggerStudy.Services;
using Microsoft.OpenApi.Models;
namespace SwaggerStudy
{
/// <summary>
/// 简单引入Swagger
/// </summary>
public class Startup01
{
public Startup01(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services
.AddControllers()
.AddJsonOptions(jsonOption=>
{
jsonOption.JsonSerializerOptions.Converters.Add(new DatetimeJsonConverter());
jsonOption.JsonSerializerOptions.Encoder= System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All);
});
#region swagger
services.AddSwaggerGen(setup =>
{
setup.SwaggerDoc("GroupA", new OpenApiInfo { Title = "Swagger学习", Version = "第一版" });
});
#endregion
services.AddTransient<StudentServer>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseSwagger();
app.UseSwaggerUI(setup =>
{
setup.SwaggerEndpoint("/swagger/GroupA/swagger.json", "Swagger学习第一版");
});
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}

@ -0,0 +1,67 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Swashbuckle;
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using Swashbuckle.AspNetCore.SwaggerUI;
using SwaggerStudy.Services;
using Microsoft.OpenApi.Models;
namespace SwaggerStudy
{
/// <summary>
/// 使用Swagger UI
/// </summary>
public class Startup02
{
public Startup02(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services
.AddControllers()
.AddJsonOptions(jsonOption=>
{
jsonOption.JsonSerializerOptions.Converters.Add(new DatetimeJsonConverter());
jsonOption.JsonSerializerOptions.Encoder= System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All);
});
services.AddTransient<StudentServer>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}

@ -0,0 +1,141 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;
using Swashbuckle;
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using Swashbuckle.AspNetCore.SwaggerUI;
using SwaggerStudy.Services;
using Microsoft.OpenApi.Interfaces;
namespace SwaggerStudy
{
/// <summary>
/// 测试用
/// </summary>
public class StartupTest
{
public StartupTest(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services
.AddControllers()
.AddJsonOptions(jsonOption=>
{
jsonOption.JsonSerializerOptions.Converters.Add(new DatetimeJsonConverter());
jsonOption.JsonSerializerOptions.Encoder= System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All);
});
//注入SwaggerGen
services.AddSwaggerGen(setup =>
{
//注意name参数即是DocumentName, 在SwaggerUi中有使用配置的终结点里必须保持一致
setup.SwaggerDoc(name: "DemoName", info: new OpenApiInfo()
{
//标题(必须的)
Title = "Title:使用Swagger",
//文档版本(必须的)
Version = "大麦版",
//应用程序的简短描述
Description = "描述Swagger学习项目全面学习Swagger使用方法。",
//暴露的API的联系信息
Contact = new OpenApiContact() { Name = "天意工作室", Url = new Uri("https://www.wanggaofeng.cn"), Email = "bicijinlian@163.com" },
//公开的API的许可证信息
License = new OpenApiLicense() { Name = "木兰宽松许可证", Url = new Uri("http://license.coscl.org.cn/MulanPSL") },
//API服务条款的URL(必须采用URL格式)
TermsOfService = new Uri("http://license.coscl.org.cn/MulanPSL"),
//此对象可以使用规范扩展进行扩展
Extensions = new Dictionary<string, IOpenApiExtension>()
{
}
});
//包含xml注释
//var xmlCommentFiles = System.IO.Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, $"SwaggerStudy.*.xml", System.IO.SearchOption.TopDirectoryOnly);
//foreach (var xmlFile in xmlCommentFiles)
//{
// setup.IncludeXmlComments(xmlFile, true);
//}
});
//配置SwaggerGen
services.ConfigureSwaggerGen(setup =>
{
});
services.AddTransient<StudentServer>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseSwagger(setup =>
{
setup.SerializeAsV2 = false;
//使用请求上下文修改Swagger
setup.PreSerializeFilters.Add((swagger, httpReq) =>
{
//删除部分接口
swagger.Paths.Remove("/api/Student/GetAll");
swagger.Paths.Remove("/api/Student/GetAllAsync");
swagger.Servers = new List<OpenApiServer> { new OpenApiServer { Url = $"{httpReq.Scheme}://{httpReq.Host.Value}" } };
});
//更改Swagger JSON端点的路径:自定义路由必须包含{documentName}参数
//默认为 /swagger/{documentName}/swagger.json
//SwaggerUi里保持一致
//终结点并非SwaggerUI访问url
setup.RouteTemplate = "/WebApi/swagger/{documentName}/swagger.json";
});
app.UseSwaggerUI(setup =>
{
//swagger 访问页面前缀默认swagger
//SwaggerUi首页地址baseUrl+前辍+index.html 默认http://localhost:8080/swagger/index.html
setup.RoutePrefix = "Swagger";
setup.SwaggerEndpoint("/WebApi/swagger/DemoName/swagger.json", "WebApi 测试版");
});
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}

@ -2,6 +2,8 @@
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);1591</NoWarn>
</PropertyGroup>
<ItemGroup>
@ -11,11 +13,11 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Swagger\" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />
<Folder Include="Swagger\" />
</ItemGroup>
</Project>

Loading…
Cancel
Save