c# - Swashbuckle swagger.json 大于 4 mb 净核
问题描述
我的 api 端点变得太大,我需要将其最小化或将其分成多个 swagger.json 文件。我想上传 swagger.json 文件以实现自动化,但有两条规则。每个文件最多 4 Mb 和最多 256 个函数。我不符合这些要求。
我希望每个控制器/组有一个 swagger 文件,这将最大限度地减少功能数量并减小文件大小。但我不知道如何配置(Swashbuckle)还是应该使用 documentFilters 来配置?
我已经使用 ApiVersioning 来减少一些功能和大小,但这还不够。而且我无法更改完整的 url 端点。我只想要多个文件而不仅仅是版本。
解决方案
有两种选择可以使这成为可能。但我想在不更改现有 api 的任何 url 的情况下做到这一点。
在每个控制器中,您可以添加设置 Apiversion
[ApiVersion("2.0")]
,然后设置控制器名称,即[ApiVersion("2.0.order")]
。每个控制器都会有一个版本。 此解决方案将更改 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。希望这对任何人都有帮助。
推荐阅读
- python - NLTK:TypeError:必须是 str,而不是列表
- java - 使用 Maven 构建一个简单的 Graal 原生示例
- java - 这个字符串需要多少份?
- python - 如何为能够包含行号为 1000 的行的支持向量回归模型准备训练集?
- networking - 在同一 Internet 连接上隔离两个网络的最佳方法?
- pandas - 美化 Pandas 数据框
- javascript - 滚动到特定 id ReactJS 时添加类
- php - 如何通过php将数据插入数据库,带有外键的表
- haskell - 运行包装在HtmlT中的Reader,产生Html()
- c# - 当我尝试在处理程序中调用应用程序变量时,为什么会出现此错误?