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

Swagger UI freezes after API fetch and browser crashes

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

我可以导航到 localhost/MyApp/swagger,我可以在 fiddler 中看到它调用 localhost/MyApp/swagger/docs/v1 来检索代表我的 JSON 的字符串=30=]。调用成功,JSON约240KB,JSON有效。此时,chrome 选项卡冻结了大约 30 秒,然后与 "Aw snap" 页面一起崩溃。控制台中没有错误。

尝试验证 this online validator 中的 api JSON 有效并表示 spec/schema 有效当且仅当我取消选中所有三个 "Follow ___ $refs" 复选框。如果勾选了其中任何一个框,大约需要 30 秒,然后该工具就会崩溃。

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

有什么方法可以为 swashbuckle(在服务器上)或 swagger UI(在客户端)打开任何类型的日志记录或调试?有没有人 运行 解决过这个浏览器崩溃的问题并且知道是什么原因造成的?提前致谢。

我能够注释掉每个 API 控制器,加载 swagger 页面,然后重新打开它们,直到页面再次崩溃。找出问题出在哪个控制器后,我对控制器中的所有端点重复了该过程。

事实证明,我们的一个非常古老的方法是将 ORM 实体作为主体参数(非常糟糕),这导致 swagger 试图解析我们的整个 ORM 对象图和 运行记忆。更改此方法以接受 DTO 而不是数据层实体解决了问题。

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

这是一个循环引用问题。

请参阅 git 中心存储库中的问题: https://github.com/domaindrivendev/Swashbuckle/issues/486

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

我们聘请了一个人来编写我们的 API,他一定已经根据 DB Schema 自动导入了一堆 classes,但它所做的是创建了大量的部分classes 引用了其他部分 classes,后者又引用了原始 class。

所以这最终是一个循环引用问题,如上所述,但不完全相同。我花了一段时间才弄清楚有什么不同,但是当我注释掉对其他部分 classes 的引用时,一切都很好。

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

另一个重要的问题是在我们的 [Route()] 标签中,那个人放了 [Route("{model}"] 并且在 POST/PUT 方法的参数中,他使用的是 [Route("{model}")] 标记来解析模型的 JSON 主体,因此将它放在 Route 标记中是不必要的并且会导致问题。应该是 [Route("")].

检查 ResponseType 方法的 ResponseType 属性。就我而言,当我修改 api 方法时,我忘记删除 reponsetype,因为我删除了返回对象。

我遇到了同样的问题。最后,我可以按照自己的意愿将 [ResponseType()] 保留为 ORM 实体,但我设法通过在 [SwaggerResponse()]

中添加另一个模型来使 swagger 不冻结

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

我们有一个来自 NetTopologySuite.Geometries 命名空间的“点”class,它让 swagger 崩溃了。

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

[Edge 和 Firefox 的行为相似。]

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

我的网站 API 已经增长到大约 55 条路线;但我怀疑问题可能源于底层 Entity Framework DbContext 的复杂性。看起来 Swashbuckle 在其 Web API 架构生成期间对 DbContext 执行反射;但我不熟悉它的实际工作原理。

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

我尽量使软件包保持最新;目前有 Swashbuckle.AspNetCore.

的版本=6.1.4

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

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