使用 Swashbuckle Asp.Net Core for ReDoc 添加 x-logo 供应商扩展

MNV*_*NVR 2 swagger swashbuckle asp.net-core-webapi

我正在使用 swagger.json 文件(由 Swashbuckle 生成)为 ReDoc 显示 API 文档。

我需要什么:x-logo供应商扩展添加到使用 Swashbuckle(Swashbuckle.AspNetCore.SwaggerGen库)生成的 swagger json,以便 ReDoc UI像这样在左上角显示徽标 在此处输入图片说明

问题: 我能够添加x-log到 swagger.json 文件,但它被添加到文件的错误部分。它需要在内部info部分。

这是我所做的添加 x-logo

  • 创建了一个如下所示的文档过滤器
    public class XLogoDocumentFilter : IDocumentFilter
        {
            public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
            {
              swaggerDoc.Extensions["x-logo"] = new { url = "https://URL/of/the/logo", altText = "Company Logo" };
            }

        }
Run Code Online (Sandbox Code Playgroud)
  • 将过滤器添加到SwaggerDoc作为
services.AddSwaggerGen(options => 
{   
  options.DocumentFilter<XLogoDocumentFilter>();

});
Run Code Online (Sandbox Code Playgroud)

实际的

    {
      "swagger": "2.0",
      "info": {
        "version": "v1",
        "title":"Sample REST API"
      },
      "x-logo": {
        "url": "https://rebilly.github.io/ReDoc/petstore-logo.png",
        "altText": "Aimia Logo"
      }
    }
Run Code Online (Sandbox Code Playgroud)

预期的

    {
      "swagger": "2.0",
      "info": {
        "version": "v1",
        "title":"Sample REST API",
        "x-logo": {
          "url": "https://rebilly.github.io/ReDoc/petstore-logo.png",
          "altText": "Aimia Logo"
        }
      },

    }
Run Code Online (Sandbox Code Playgroud)

非常感谢x-logo在 swagger.json 文件的正确部分提供任何帮助或建议。

小智 7

较新版本的 Swashbuckle 在 SwaggerDoc 设置中支持这一点:

c.SwaggerDoc("v1", new OpenApiInfo
{
  Title = ApiDescription,
  Version = "v1",
  Extensions = new Dictionary<string, IOpenApiExtension>
    {
      {"x-logo", new OpenApiObject
        {
           {"url", new OpenApiString("https://blah.com/logo")},
           { "altText", new OpenApiString("The Logo")}
        } 
      }
    }
});
Run Code Online (Sandbox Code Playgroud)


MNV*_*NVR 5

输入问题后,我自己找到了解决方案。不是直接向 swaggerDoc 添加扩展,而是将其添加到 swaggerDoc.Info 对象。

public class XLogoDocumentFilter : IDocumentFilter
        {
            public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
            {   
              // need to check if extension already exists, otherwise swagger 
              // tries to re-add it and results in error  
              if (!swaggerDoc.Info.Extensions.ContainsKey("x-logo"))
              {
                 swaggerDoc.Info.Extensions.Add("x-logo", new {
                    url = "https://URL/To/The/Logo",
                    altText = "Logo",
                });
              }           

            }

        }
Run Code Online (Sandbox Code Playgroud)