繁体   English   中英

Swashbuckle swagger.json 大于 4 mb 净核心

[英]Swashbuckle swagger.json larger than 4 mb net core

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

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

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

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

  1. 在每个 controller 中,您可以添加设置 Apiversion [ApiVersion("2.0")]然后设置控制器名称,即[ApiVersion("2.0.order")] 每个 controller 都会有一个版本。 此解决方案将更改 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 希望这对任何人都有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM