如何使用 Swashbuckle Swagger UI 显示静态 swagger.json 文件而不是 SwaggerGen 动态创建的定义?

How can I use Swashbuckle's SwaggerUI to display a static swagger.json file instead of SwaggerGen's dynamically created definiton?

我有一个 ASP.NET Core MVC 应用程序,面向 .NET Core 2.1 框架。此应用程序提供 RESTful API 和 returns JSON 数据。

使用 SwaggerHub 中基于 Web 的交互式 SwaggerGen,我创建了一个 API 定义文档并将其以 JSON 格式保存为 'swagger.json'我的 ASP.NET 核心 MVC 应用程序项目中的文件夹。

因为我已经定义了 API,所以我不需要在我的应用程序中 运行 SwaggerGen。我只是想让 SwaggerUI 显示我创建的静态 'swagger.json' 文件。

我已经阅读了 Swashbuckle 文档以及一些 "How to get started with Swashbuckle" 教程,但它们都假设 SwaggerGen 将用于从我的 API 动态创建 Swagger API 文档.

我已将 'Swashbuckle.AspNetCore' NuGet 包添加到我的应用程序的依赖项中。

在我的应用程序 Startup.cs class 的 Configure() 方法中,我添加了 UseSwaggerUI 指令:

app.UseSwaggerUI(c => {
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");

当我 运行 我的应用程序在 Visual Studio 时,我得到一个正常的空白页。

根据 Swashbuckle 文档,SwaggerUI 格式的 API 文档应该在相对的“/swagger”路径中可用,假设已添加 SwaggerGen 并动态生成 API 定义(文件?)。

获取相对“/swagger”路径会产生“400 错误请求”错误。

问:SwaggerGen 会生成自己的 'swagger.json' 文件吗?如果是,它将在哪里创建此文件?

问:有没有办法告诉 SwaggerUI 在哪里可以找到并显示我手动创建的 'swagger.json' API 定义文件?

谢谢!

您可以使用 url 参数告诉任何 Swagger-UI 在哪里可以找到文件:

这就是您所需要的,您可以使用任何 Swagger-UI 如果您已经使用 SwaggerHub 生成了定义,则无需安装 swashbuckle。


如果您想自己托管 Swagger-UI,只需将 dist 文件夹复制到您的网络服务器即可:
https://github.com/swagger-api/swagger-ui/tree/master/dist

  1. 在你的本地机器上,做一个小节点项目,安装swagger-ui-dist

  2. 将安装的文件从 node_modules/swagger-ui-dist 复制到您托管 swagger 站点的网络服务器

  3. 将生成的 swagger.json 复制到网络服务器中的相同文件夹

  4. 编辑 index.html 并将 url 添加到您的 json 中,例如。 '/swagger.json'

  5. 完成

来源

https://yanhan.github.io/posts/2017-11-26-using-swagger-ui-with-any-codebase/

我想用一个核心网站把一个外部的EDMX转换成OpenAPI格式然后显示出来..所以我想出来了

我能够像这样使用 Microsoft's OData sample 并将静态 JSON 服务到 Swasbhuckle 驱动的 SwaggerUI 中:

  1. 在您的项目中创建一个目录,例如generatedjson
  2. 将您的 json(打开 api 文档)放入所述文件夹
  3. 允许从此文件夹提供静态文件
  4. 在 UseSwaggerUI 中,我添加了一个新的 SwaggerUI 端点
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "OData 8.x OpenAPI");
        c.SwaggerEndpoint("/generatedjson/swagger.json", "SAP Business One");
    });

    app.UseRouting();

    // Test middleware
    app.Use(next => context =>
    {
        var endpoint = context.GetEndpoint();
        if (endpoint == null)
        {
            return next(context);
        }

        return next(context);
    });

    //app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });

    app.UseStaticFiles(new StaticFileOptions()
    {
        FileProvider = new PhysicalFileProvider(
            System.IO.Path.Combine(Directory.GetCurrentDirectory(), @"generatedjson")),
        RequestPath = new PathString("/generatedjson")
    });
}

FWIW - 如果这是您网站的全部功能

那么您可以随意禁用 ConfigureServices

中的 EDM 生成服务
           services.AddControllers();
                //.AddOData(opt => opt.Count().Filter().Expand().Select().OrderBy().SetMaxTop(5)
                    //.AddRouteComponents(model0)
                    //.AddRouteComponents("v1", model1)
                    //.AddRouteComponents("v2{data}", model2, services => services.AddSingleton<ODataBatchHandler, DefaultODataBatchHandler>())
                    //.AddRouteComponents("v3", model3)
                    //.Conventions.Add(new MyConvention())
                

            services.AddSwaggerGen();