【问题标题】:Swashbuckle swagger.json larger than 4 mb net coreSwashbuckle swagger.json 大于 4 mb 净核
【发布时间】:2021-07-14 10:52:02
【问题描述】:

我的 api 端点变得太大,我需要将其最小化或将其分成多个 swagger.json 文件。 我想上传 swagger.json 文件以实现自动化,但有两条规则。每个文件最多 4 Mb 和最多 256 个函数。我不符合这些要求。

我希望每个控制器/组都有一个 swagger 文件,这将最大限度地减少功能数量并减小文件大小。 但我不知道如何配置(Swashbuckle)还是应该使用 documentFilters 来配置?

我已经使用 ApiVersioning 来减少一些功能和大小,但这还不够。而且我无法更改完整的 url 端点。我只想要多个文件而不仅仅是版本。

【问题讨论】:

  • 我认为您可以使用“组”,但我忘记了具体细节。也许尝试将其用作您的搜索词之一
  • @pinkfloydx33 谢谢我使用组名。如果我更改此设置,则 url 正在更改。即 localhost/api/v1/orders 并将其更改为 localhost/api/v1.orders/orders。所以小组是正确的方式,我会更新问题

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


【解决方案1】:

有两个选项可以使这成为可能。但我想在不更改现有 api 的任何 url 的情况下做到这一点。

  1. 在每个控制器中,您可以添加设置 Apiversion [ApiVersion("2.0")],然后设置控制器名称,即 [ApiVersion("2.0.order")]。每个控制器都会有一个版本。 此解决方案将更改 url,并且不适用于现有 api。

  2. 另一种解决方案是使用过滤器为每个操作创建标签,现在我们可以为每个端点创建一个过滤器

    public class ApplySwaggerOperationTags : IOperationFilter
        {
            public void Apply(OpenApiOperation operation, OperationFilterContext context)
            {
                var tag = new OpenApiTag();
                context.ApiDescription.ActionDescriptor.RouteValues.TryGetValue("controller",out string tagname);
                tag.Name = tagname;
                operation.Tags.Add(tag);
    
                var tagGroupName = new OpenApiTag();
                tagGroupName.Name = context.ApiDescription.GroupName;
                operation.Tags.Add(tagGroupName);
            }
        }

然后应用文档过滤器

 public class SwaggerDocumentFilter : IDocumentFilter
    {
        public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
        {
            // Key is read-only so make a copy of the Paths property
            var pathsFiltered = new OpenApiPaths();
            var array = context.DocumentName.Split("-");
            string version = array[0];
            string tag = string.Empty;
            if (array.Count() > 1)
            {
                tag = array[1];
            }

            foreach (var path in swaggerDoc.Paths)
            {
                if (path.Value.Operations.Values.First().Tags.FirstOrDefault(c => c.Name == version) != null)
                {
                    if (path.Value.Operations.Values.First().Tags.FirstOrDefault(c => c.Name.ToLower() == tag.ToLower()) != null ||
                        tag == string.Empty)
                    {
                        // Add the path to the filtered collection
                        pathsFiltered.Add(path.Key, path.Value);
                    }
                }
            }
            swaggerDoc.Paths = pathsFiltered;
        }
    }

关键是让 c.SwaggerEndpoint(in UseSwaggerUI) 和 options.SwaggerDoc(in SwaggerGenOptions) 匹配

要检查的一个很好的例子是https://github.com/cbruen1/SwaggerFilter。 希望这对任何人都有帮助。

【讨论】:

  • 仅阅读代码:执行FirstOrDefault().Whatever 会导致 NullReferenceExceptions。要么制作一个First().Whatever,要么(我认为你的情况更好)一个FirstOrDefault()?.Whatever
  • @Oliver 是的,正确 First() 更好。然后你会得到一个更好的例外。但希望这不会发生,因为标签是自动添加的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 2019-05-16
相关资源
最近更新 更多