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

时间:2016-02-24 14:52:41

标签: .net asp.net-web-api swagger swagger-ui swashbuckle

我有一个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有效。此时,镀铬标签会在使用" Aw snap"崩溃之前冻结约30秒。页。控制台中没有错误。

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

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

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

7 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:1)

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

这是一个循环参考问题。

在git hub存储库中查看问题: https://github.com/domaindrivendev/Swashbuckle/issues/486

答案 2 :(得分:0)

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

我们让一个人签约了写我们的API,他必须已经自动导入了基于DB Schema的一堆类,但是这样做是创建了大量的部分类,并引用了其他部分类,而后者又反过来有对原始类的引用。

因此,如上所述,这最终成为一个循环参考问题,但并不完全相同。我花了一段时间才弄清楚有什么不同,但是当我注释掉对其他局部类的引用时,一切工作都很好。

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

另一个重要的挂断是在我们的[Route()]标记中,那个家伙放了[Route("{model}"],并且在POST / PUT方法的参数中,他正在使用[Route("{model}")]标记进行解析模型的JSON主体,因此将其包含在Route标记中是不必要的,并且会引起问题。应该是[Route("")]

答案 3 :(得分:0)

检查您的ResponseType属性中的api方法。就我而言,在修改api方法时,我忘记删除响应类型,因为我删除了返回对象。

答案 4 :(得分:0)

我有同样的问题。最终,我可以按照自己的意愿将[ResponseType()]留给ORM实体,但是我通过在[SwaggerResponse()]

中添加了另一个模型来设法避免冻结

更多信息如下: https://mattfrear.com/2015/04/21/generating-swagger-example-responses-with-swashbuckle/

答案 5 :(得分:0)

我们有一个来自 NetTopologySuite.Geometries 命名空间的“Point”类,它使 swagger 崩溃。

答案 6 :(得分:0)

我一直在尝试找出 Swagger UI 产生“页面无响应/您可以等待它响应或退出页面”的原因。对话框(正如它在 Chrome 中显示的那样。)Chrome 偶尔会发出“啊,快!错误代码:内存不足。”

[Edge 和 Firefox 的行为相似。]

如果我反复告诉浏览器等待,大约一两次,请求最终会成功。这显然是一个不确定的、间歇性的错误。因此,它不太可能是某种循环引用的结果。看起来 Swagger UI 只是使用了太多内存,导致浏览器超时。

我的 Web API 已经增长到大约 55 个路由;但我怀疑这个问题可能源于底层实体框架 DbContext 的复杂性。 Swashbuckle 似乎在生成其 Web API 模式期间对 DbContext 执行反射;但我不熟悉这实际上是如何工作的。

我第一次在 ASP.NET Core 3.1 中遇到这个问题;但我目前的目标是 .NET 6 Preview 5。

我尽量保持软件包是最新的;并且目前有 Swashbuckle.AspNetCore 的 Version=6.1.4。

我已尝试从我的项目中排除 Web API 的每个子路径。这仅在我删除了所有引用 DbContext 的路由时才开始起作用。

我有其他基于更简单的 EF 数据模型的 Web API 项目,其中 Swagger UI 工作得很好。