我有一个包含超过90个表的数据库,这些表都使用外键交叉链接。
当我打开我的API的swagger页面时,加载需要2分钟。原因似乎是它为每个API生成模型和示例值。由于交叉链接,几乎每个实体引用所有其他实体(通过递归传递闭包)!
当swagger生成模型和示例值时,有没有办法禁用或限制递归?
例如,
class A {
int id;
List<B> Blist;
}
class B {
int id;
List<C> Clist;
}
class C {
int id;
List<D> Dlist;
}
/// etc...
如果我有GET /api/A
的API,那么我不想将所有课程都拉到招摇页模型。它太大了!我只想拉A。
答案 0 :(得分:5)
你的问题的答案很简短
当swagger生成模型和示例时,有没有办法限制递归?
不幸的是没有!
目前没有这样的选择。但这是可能的,我们正在讨论它:
https://github.com/swagger-api/swagger-ui/issues/4411
在那里添加评论和+1这个问题,让团队知道这对你很重要。
Swagger-UI不能很好地处理复杂的模式,有时只是它会使浏览器崩溃的其他模式很慢,团队意识到并希望我们很快就会得到修复。
现在你的版本(2.x)不再受支持,因此不会有修复...
你试过Swagger-Net吗?这是我的分叉,我正在使用最新版本的UI
答案 1 :(得分:0)
这是一个似乎&#34;修复&#34;它。我将此添加到SwaggerConfig.cs
c.MapType<MasterModel>(() => new Schema { type = "integer", format = "int32" });
c.MapType<MasterLocationModel>(() => new Schema { type = "integer", format = "int32" });
c.MapType<LocationModel>(() => new Schema { type = "integer", format = "int32" });
我有更多类型,但这三个是中心类型,因此通过将它们映射到整数,它将递归限制在合理的水平。它也使得招摇页面错误,但至少它加载了!
也许有一种方法可以使用SchemaFilter
更好地做到这一点?任何帮助将不胜感激。
修改强>
最后,我们决定拆分我们的类,以便swagger无法看到超过一个级别的引用。例如,
class A_Base {
int id;
}
class A : A_Base {
List<B_Base> Blist;
}
class B_Base {
int id;
}
class B : B_Base {
List<C_Base> Clist;
}
class C_Base {
int id;
}
class C : C_Base {
List<D_Base> Dlist;
}
并且我们所有的控制器API都使用类型A,B,C。swagger doc只会在每个类型上深入一层。递归不会失控。它也更正确,因为我们的API返回的对象通常只有零或一个深度。