我们的 Blazor 服务器应用程序存在问题。我们的应用程序全天显示实时数据。如果我们运行几个小时,我们没有问题,但在长时间运行测试中,10小时或更长时间后,客户端停止工作(有时页面之间没有切换,有时停止使用SignalR刷新数据)。
如果我们关闭并重新打开浏览器页面,应用程序将再次开始工作。我们的日志和 Windows 事件查看器中没有任何错误。
我们在 Visual Studio 2022 调试模式和应用程序发布后的 IIS 中具有相同的行为。 我该如何解决这个问题?
这里有一些进一步排除故障的想法。问题是浏览器和 Blazor 服务器之间的 SignalR 连接断开。发生这种情况时,浏览器将不会收到页面 DOM 的更新,并且您会遇到“页面之间无法切换”的情况。如果您在本地调试 Blazor 服务器,则可以通过在调试断点处等待来重现 SignalR 断开连接。
发生此错误时检查浏览器开发工具。如果浏览器失去 SignalR 连接,JS 控制台中应该会出现异常。这将确认 SignalR 断开连接,并可能提供根本原因的提示(即 .razor 代码中可能存在未处理的应用程序异常)
考虑使用 JS 手动建立 SignalR 连接。这个SO线程/答案有一些关于如何使用JS代码为Blazor服务器进行设置的信息。这种方法使您有机会检测断开连接(从浏览器/客户端)并自动从浏览器重新连接。
考虑使用托管的 Azure SignalR 服务以获得更好的连接。请注意,如果根本原因是电路和集线器超时选项,您可以配置这些选项。
实现 CircuitHandler 来跟踪 Blazor 服务器上的 SignalR 连接。这将有助于监控来自服务器的 SignalR 连接。您可以使用它来识别服务器端连接何时丢失,并可能触发页面刷新以重新连接。
最后,请考虑浏览器和 Blazor 服务器之间的 SignalR 连接可能会中断。例如,某些用户无法通过 VPN 连接访问 Blazor Server 应用程序,因为 SignalR/WebSocket 连接已损坏。 IIS 的超时可能会影响您的应用程序。
没有附加代码(如果显示回调注册会有所帮助),所以我只能猜测。当您调用
hubConnection.On
时,请注意它会返回 IDisposable
。它用于在不再需要时取消订阅。据我所知(简要查看代码后),SignalR 不会保留对订阅对象的引用。如果您的组件也不持有它,GC 将在一段时间后收集它,并取消您的订阅。当然,在这种情况下,任何日志中都不会出现错误。
可悲的是,MS 文档中的示例聊天应用程序也不支持订阅对象...
希望它有帮助,所描述的症状也符合我对我的应用程序的期望,如果它在一页上停留足够长的时间(当我注意到这个潜在问题并正在搜索更多信息时,我只是想了解 blazor 服务器 SignalR)。