SignalR(蔚蓝)。确定用户断开连接的原因

SignalR (Azure). Determine reason of why user got disconnected

我们在 Azure 上托管了 SignalR 服务。

由于技术原因,我们必须尽可能保持客户端和主机之间的稳定连接。正在发生的事情是,在相对随机的时间间隔内,一些客户端会断开连接。我们知道这与客户端的互联网连接无关。

所以,问题是,我们如何确定断开连接的原因。 我们的 SignalR 集线器实现了覆盖 'OnDisconnectedAsync'。这个方法有 'Exception exc' 参数。不幸的是,每次它被触发时,exc 总是空的(我希望在那里找到断开连接的详细信息)。

其他详细信息: 我们在服务器端使用以下 SignalR 包: Microsoft.AspNet.SignalR (2.4.0) Microsoft.Azure.SignalR (1.0.5)

在客户端我们使用 "Microsoft.AspNetCore.SignalR.Client.Core" (1.1.0)

另外,我们检查过,我们在 Azure SignalR 上有足够的资源(单位)

以下是用户断开连接时的日志(发生在 OnDisconnectedAsync 之后): 2020-03-15 11:38:07.391 +00:00 [调试] Microsoft.AspNetCore.SignalR.HubConnectionHandler:OnConnectedAsync 结束。 2020-03-15 11:38:07.391 +00:00 [调试] Microsoft.Azure.SignalR.ServiceConnection:向 GFf8suySt2eMsOCLuYg0-wbb16618b1 的服务发送关闭连接消息。 2020-03-15 11:38:07.391 +00:00 [调试] Microsoft.AspNetCore.Http.Connections.Client.Internal.WebSocketsTransport:收到来自应用程序的消息。有效载荷大小:36。 2020-03-15 11:38:07.393 +00:00 [调试] Microsoft.AspNetCore.Http.Connections.Client.Internal.WebSocketsTransport:收到消息。类型:二进制,大小:37,EndOfMessage:True。 2020-03-15 11:38:07.393 +00:00 [调试] Microsoft.Azure.SignalR.ServiceConnection:从服务 12aa875c-a5b6-4842-8bc1-2d67e7ab30f6 接收到 37 个字节。 2020-03-15 11:38:07.393 +00:00 [调试] Microsoft.Azure.SignalR.ServiceConnection:连接 GFf8suySt2eMsOCLuYg0-wbb16618b1 结束。

当客户端连接到 Azure SignalR 时,客户端和 Azure SignalR 之间的持久连接有时会因不同原因而断开。本部分描述了导致此类连接中断的几种可能性,并提供了一些有关如何确定根本原因的指导。

从客户端看到的可能错误:

  • 对方没有完成关闭握手就关闭了WebSocket连接
  • 服务超时。 30.00 毫秒过去了,没有收到来自服务的消息。
  • {"type":7,"error":"Connection closed with an error."}
  • {"type":7,"error":"Internal server error."}

根本原因:

在各种情况下客户端连接可能会断开:

  • 当集线器对传入请求抛出异常时。
  • 当客户端路由到的服务器连接断开时,请参阅以下部分了解有关服务器连接断开的详细信息。
  • 当客户端和 SignalR 服务之间发生网络连接问题时。
  • 当 SignalR 服务出现实例重启、故障转移、部署等内部错误时。

请参考https://github.com/Azure/azure-signalr/blob/dev/docs/tsg.md#client-connection-drops