API获取和浏览器崩溃后,Swagger UI冻结

问题描述 投票:5回答:3

我有一个ASP.NET WebAPI项目,我试图用Swagger UI替换旧的XmlDocumentationProvider页面。我正在使用swashbuckle swagger for webAPI 5.3.1 nuget包。

我能够导航到localhost / MyApp / swagger,我可以在fiddler中看到它调用localhost / MyApp / swagger / docs / v1来检索代表我的API的JSON字符串。调用成功,JSON大约240KB,JSON有效。此时,Chrome标签会在使用“Aw snap”页面崩溃之前冻结约30秒。控制台中没有错误。

试图在this online validator中验证api JSON并且说如果我取消选中所有三个“Follow ___ $ refs”复选框,那么spec / schema是有效的。如果勾选了这些框中的任何一个,则大约需要30秒,然后该工具崩溃。

不幸的是,我不能在某处粘贴我的整个webAPI规范,但我会说这是一个非常庞大且非常复杂的内部业务应用程序。我们的一些DTO具有循环引用(与DTO本身相同类型的属性),我怀疑它可能会导致问题,但是没有任何记录或调试我无法确定,并且有超过1000个DTO类我不想梳理它们全部检查。

有没有办法打开swashbuckle(在服务器上)或swagger UI(在客户端上)的任何类型的日志记录或调试?有没有人遇到这个问题浏览器崩溃,并知道是什么导致它?提前谢谢。

.net asp.net-web-api swagger swagger-ui swashbuckle
3个回答
11
投票

我能够注释掉每个API控制器,加载swagger页面,然后重新打开它们,直到页面再次崩溃。一旦我弄清楚哪个控制器是问题,我就用控制器中的所有端点重复该过程。

事实证明,我们的一个非常古老的方法是将一个ORM实体作为一个身体参数(非常糟糕),这导致招摇过程试图解析整个ORM对象图并耗尽内存。更改此方法以接受DTO而不是数据层实体解决了该问题。


1
投票

我认为当您使用非标准序列化程序或Web api的配置是非标准时,这是一个已知的错误。

这是一个循环参考问题。

请参阅github存储库中的问题:qazxsw poi


0
投票

如果其他人遇到这个问题,似乎没有任何帮助你,这就是我在我们的代码中找到的。

我们有一个签约编写API的人,他必须根据DB Schema自动导入一堆类,但它所做的是创建大量的部分类,并引用其他部分类,而这些类又引用了参考到原来的班级。

因此,如上所述,这最终成为循环引用问题,但不完全相同。我花了一段时间来弄清楚什么是不同的,但是一旦我评论了对其他部分类的引用,一切都很好。

我的建议是上述2个答案的组合,使用您自己的DTO并确保您没有循环引用。

另一个重要的问题是在我们的https://github.com/domaindrivendev/Swashbuckle/issues/486标签中,那个人放了[Route()]并且在POST / PUT方法的参数中,他使用[Route("{model}"]标签来解析模型的JSON主体,所以在Route标签中有它是不必要和造成问题。它本来应该是[Route("{model}")]

© www.soinside.com 2019 - 2024. All rights reserved.