带有 SignalR 的 Blazor Server 客户端无法工作

问题描述 投票:0回答:2

我们的 Blazor 服务器应用程序存在问题。我们的应用程序全天显示实时数据。如果我们运行几个小时,我们没有问题,但在长时间运行测试中,10小时或更长时间后,客户端停止工作(有时页面之间没有切换,有时停止使用SignalR刷新数据)。

如果我们关闭并重新打开浏览器页面,应用程序将再次开始工作。我们的日志和 Windows 事件查看器中没有任何错误。

我们在 Visual Studio 2022 调试模式和应用程序发布后的 IIS 中具有相同的行为。 我该如何解决这个问题?

  1. 减少客户端的内存使用。
  2. 使用 SignalR 实现 OnDisconnect 以删除非活动连接。
  3. 将 IIS 空闲超时设置为 0,以便永不关闭与客户端的连接
blazor signalr blazor-server-side blazor-webassembly
2个回答
1
投票

这里有一些进一步排除故障的想法。问题是浏览器和 Blazor 服务器之间的 SignalR 连接断开。发生这种情况时,浏览器将不会收到页面 DOM 的更新,并且您会遇到“页面之间无法切换”的情况。如果您在本地调试 Blazor 服务器,则可以通过在调试断点处等待来重现 SignalR 断开连接。

  1. 发生此错误时检查浏览器开发工具。如果浏览器失去 SignalR 连接,JS 控制台中应该会出现异常。这将确认 SignalR 断开连接,并可能提供根本原因的提示(即 .razor 代码中可能存在未处理的应用程序异常)

  2. 考虑使用 JS 手动建立 SignalR 连接。这个SO线程/答案有一些关于如何使用JS代码为Blazor服务器进行设置的信息。这种方法使您有机会检测断开连接(从浏览器/客户端)并自动从浏览器重新连接。

  3. 考虑使用托管的 Azure SignalR 服务以获得更好的连接。请注意,如果根本原因是电路和集线器超时选项,您可以配置这些选项。

  4. 实现 CircuitHandler 来跟踪 Blazor 服务器上的 SignalR 连接。这将有助于监控来自服务器的 SignalR 连接。您可以使用它来识别服务器端连接何时丢失,并可能触发页面刷新以重新连接。

最后,请考虑浏览器和 Blazor 服务器之间的 SignalR 连接可能会中断。例如,某些用户无法通过 VPN 连接访问 Blazor Server 应用程序,因为 SignalR/WebSocket 连接已损坏。 IIS 的超时可能会影响您的应用程序。


0
投票

没有附加代码(如果显示回调注册会有所帮助),所以我只能猜测。当您调用

hubConnection.On
时,请注意它会返回
IDisposable
。它用于在不再需要时取消订阅。据我所知(简要查看代码后),SignalR 不会保留对订阅对象的引用。如果您的组件也不持有它,GC 将在一段时间后收集它,并取消您的订阅。当然,在这种情况下,任何日志中都不会出现错误。

可悲的是,MS 文档中的示例聊天应用程序也不支持订阅对象...

希望它有帮助,所描述的症状也符合我对我的应用程序的期望,如果它在一页上停留足够长的时间(当我注意到这个潜在问题并正在搜索更多信息时,我只是想了解 blazor 服务器 SignalR)。

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