对于大型架构,Swashbuckle非常慢

时间:2018-04-27 20:43:54

标签: c# .net swagger swashbuckle

我有一个包含超过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。

2 个答案:

答案 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返回的对象通常只有零或一个深度。