【问题标题】:ASP.NET.core swagger generate swagger file programaticallyASP.NET.core swagger 以编程方式生成 swagger 文件
【发布时间】:2022-12-13 05:08:23
【问题描述】:

我有一个从向导创建的 asp.net 核心 web api - 它生成的代码如下:

        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.
            builder.Services.AddAuthorization();

            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }
    ...

如果我运行它,我会得到一个 swagger url,然后我可以去

https://localhost:7100/swagger/v1/swagger.yaml

并获得一个 yaml 文件......这一切都很好。

问题

但是,由于各种原因,我在 CI/CD 过程中需要那个 yaml 文件,所以我想在构建后动态获取它,但是启动 Web 服务器、调用它和将其关闭有很多方法可能出错。我想做的只是制作一个命令行选项来获取永远不会在 http 上侦听的 swagger 文件。所以我可以运行“dotnet run myApi generate_swagger_yaml >swagger.yaml”,比如:

public static void Main(string[] args)
{
   if (args[0] == "generate_swagger_yaml")
   {
        var yamlFile = ....somehow get the swagger yaml file...
        Console.Writeline( yamlfile );
        return 0;
   }
   ...

但我不知道该怎么做。

【问题讨论】:

    标签: c# asp.net-core swagger openapi swashbuckle.aspnetcore


    【解决方案1】:

    我实际上会推荐不是直接将其构建到您的应用程序中。 Swashbuckle(实际上在运行时生成 swagger 文档的库)提供了一个 CLI 工具,它可以使用一个程序集 DLL 并在一个命令中输出 swagger。 在这里查看:https://github.com/domaindrivendev/Swashbuckle.AspNetCore#swashbuckleaspnetcorecli

    您的 CI/CD 可以使用它来将 Swagger/OpenAPI 文档输出到一个文件中。

    【讨论】:

    • 这很有趣 - 这可能是我的方式 - 但是 a)无论如何我们都将 UI 嵌入到应用程序中,因为它使开发时的生活更轻松,更重要的是 b) - 对于我需要的,我实际上需要修改yaml 有点符合某些标准,所以如果我能在代码中做到这一点就容易多了
    • 我花了一些时间研究 Swashbuckle 代码,CLI 的工作方式,它在技术上启动了您的网络主机。这样做的原因似乎是因为所有 swagger 配置都位于 hostbuilder magic 中,我认为它无法在不执行该位的情况下实际生成 swagger 文档。如果您执意使用 C# 执行操作,我会看看您是否可以利用 Swashbuckle.Cli 中的逻辑:github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/master/… 为您的应用程序创建 CLI 条目。
    【解决方案2】:

    自从我上次回答以来,我不得不对 Swashbuckle 和 Swagger 生成进行更多试验,并且我已经找到了您最初问题的实际答案。

    创建构建器后:

    var app = builder.Build();
    

    您需要从中获取 IServiceProvider 并使用它来解析 ISwaggerProvider 的实例。有了这个,你就可以获得 swagger 文档并将其呈现为 Json 或 Yaml。

    var swaggerProvider = app.Services.GetRequiredService<ISwaggerProvider>();
    var swagger = swaggerProvider.GetSwagger("autogen");
    var stringWriter = new StringWriter();
    swagger.SerializeAsV3(new OpenApiYamlWriter(stringWriter));
    var swaggerYaml = stringWriter.ToString();
    Console.WriteLine(swaggerYaml);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多