![](/img/trans.png)
[英]ASP.NET Core - Swashbuckle not creating swagger.json file
[英]Swashbuckle swagger.json larger than 4 mb net core
我的 api 端点变得太大,我需要将其最小化或将其分成多个 swagger.json 文件。 我想上传 swagger.json 文件以实现自动化,但有两条规则。 每个文件最多 4 Mb 和最多 256 个函数。 我不符合这些要求。
我希望每个控制器/组有一个 swagger 文件,这将最大限度地减少功能数量并减小文件大小。 但我不知道如何配置(Swashbuckle)还是应该使用 documentFilters 来配置?
我已经使用 ApiVersioning 来减少一些功能和大小,但这还不够。 而且我无法更改完整的 url 端点。 我只想要多个文件而不仅仅是版本。
有两种选择可以使这成为可能。 但我想在不更改现有 api 的任何 url 的情况下做到这一点。
在每个 controller 中,您可以添加设置 Apiversion [ApiVersion("2.0")]
然后设置控制器名称,即[ApiVersion("2.0.order")]
。 每个 controller 都会有一个版本。 此解决方案将更改 url,并且不适用于现有的 api。
另一种解决方案是使用过滤器为每个操作创建标签,现在我们可以为每个端点创建一个过滤器
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.