.NET 6.0:如何在 .NET 6.0 中生成 Swagger.json 文件?

6

我希望在构建过程中生成Swagger.Json文件,并在API网关中使用它来配置端点。

我尝试了以下步骤,但没有成功。

创建工具清单:

dotnet new tool-manifest

安装Swashbuckle CLI工具并将其添加到本地清单文件中:但是这一步失败了

dotnet tool install --version 6.4.0 Swashbuckle.AspNetCore.Cli

错误:

 NU1202: Package Swashbuckle.AspNetCore.Cli 6.4.0 is not compatible with net6.0 (.NETCoreApp,Version=v6.0). Package Swashbuckle.AspNetCore.Cli 6.4.0 supports:
  - net5.0 (.NETCoreApp,Version=v5.0) / any
  - net6.0 (.NETCoreApp,Version=v6.0) / any
  - netcoreapp2.1 (.NETCoreApp,Version=v2.1) / any
  - netcoreapp3.0 (.NETCoreApp,Version=v3.0) / any
NU1212: Invalid project-package combination for Swashbuckle.AspNetCore.Cli 6.4.0. DotnetToolReference project style can only contain references of the DotnetTool type 
NU1212: Invalid project-package combination for Swashbuckle.AspNetCore.Cli 6.4.0. DotnetToolReference project style can only contain references of the DotnetTool type 
Package 'Swashbuckle.AspNetCore.Cli 6.4.0' has a package type 'DotnetTool' that is not supported by project 'WebApi'.

1
该问题已经有一个与 Swashbuckle 团队相关的 Github 问题 - CodingMytra
4个回答

5
这个解决方案仅适用于Swashbuckle V5或更新版本
其他解决方案适用于V4版本,但它们将无法正常工作。
以下是Swashbuckle V5的新解决方案。
添加以下扩展方法。
using Microsoft.OpenApi.Extensions;
using Swashbuckle.AspNetCore.Swagger;

public static class SwaggerExtensions
{
    public static void SaveSwaggerJson(this IServiceProvider provider)
    {
        ISwaggerProvider sw = provider.GetRequiredService<ISwaggerProvider>();
        OpenApiDocument doc = sw.GetSwagger("v1", null, "/");
        string swaggerFile = doc.SerializeAsJson(Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0);
        File.WriteAllText("swaggerfile.json", swaggerFile);
    }
}

一些注意事项
- 如果你想要 .yml 文件,可以使用 SerializeAsYaml 替代 SerializeAsJson - 你可以使用 Microsoft.OpenApi.OpenApiSpecVersion 枚举来指定 OpenAPI 协议的版本
如果你正在使用新的 ASP.NET Core 模板,你可以像这样调用这个方法。
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
...
WebApplication app = builder.Build();
...
app.Services.SaveSwaggerJson();
...
app.Run();

1
不明白为什么你的回答没有得到任何投票。对我来说有效,谢谢。 - undefined
@AbdulG,答案很新,就在一周前,但我想问你一个问题,生成的Swagger文件是否完整?因为在我的情况下,它并不完整,但可能是因为我做错了什么,我有很多定制的Swagger,对你来说是否完美运行? - undefined
它按预期生成并完整,更大的挑战是让Swagger使用自定义的.json文件。 - undefined

4

2
这里有一篇关于在构建时生成swagger.json文件的好文章。
这是摘要。
  1. 在项目的根文件夹中执行以下命令:

    dotnet new tool-manifest
    
  2. 然后执行以下命令:

    dotnet tool install SwashBuckle.AspNetCore.Cli
    
  3. 将以下代码片段添加到包含 Swagger NuGet 包的 Web 项目的 .csproj 文件中:

    <Target Name="CreateSwaggerJson" AfterTargets="Build" Condition="$(Configuration)=='Debug'">
       <Exec Command="dotnet swagger tofile --output ./PATH_WHERE_YOU_WANT/swagger.json $(OutputPath)$(AssemblyName).dll v1" WorkingDirectory="$(ProjectDir)" />
    </Target>
    
PATH_WHERE_YOU_WANT 替换为您想要的路径(使用已存在的文件夹,此脚本不会创建不存在的文件夹)

0
这个解决方案仅适用于Swashbuckle V4或更早版本
以下是从github post中提取、清理和重构的代码。
using Swashbuckle.AspNetCore.Swagger;
using Newtonsoft.Json;

public static class SwaggerExtensions
{
    private static string GenerateSwagger(this IServiceProvider provider)
    {
        ISwaggerProvider sw = provider.GetRequiredService<ISwaggerProvider>();
        OpenApiDocument doc = sw.GetSwagger("v1", null, "/");
        return JsonConvert.SerializeObject(
            doc,
            Formatting.Indented,
            new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore,
                ContractResolver = new SwaggerContractResolver(new JsonSerializerSettings())
            });
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接