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 工作得很好。
我有一个 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()]
这里有更多信息: 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 工作得很好。