首页 > 解决方案 > SignalR SocketException 仅在 Azure VM 上运行时

问题描述

我有一个使用 SignalR 在客户端和服务器之间进行通信的应用程序。一切最终都在本地运行,但是当我部署到 Azure 虚拟机时,我会定期收到以下异常:

Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets[14] 连接 ID“0HLH19P3L3KJB”通信错误。System.IO.IOException:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机没有响应---> System.Net.Sockets.SocketException:连接尝试由于连接方在一段时间后没有正确响应而失败,或者由于连接的主机在 Microsoft.AspNetCore 的 Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal.SocketAwaitable.GetResult() 处未能响应而建立连接失败.Server.Kestrel.Transport.Sockets.Internal.SocketConnection.ProcessReceives() 在 Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal.SocketConnection。

我已经阅读了所有与超时相关的东西 wrt SignalR 并且共识似乎是保留默认设置应该可以正常工作,所以我还没有尝试调整任何设置。

这个异常是我应该预料到的,应该处理,还是我应该尝试从源头解决的不寻常的事情?我应该在 Azure VM 配置中寻找可能导致此问题的任何内容吗?还是我应该使用 SignalR 本身的超时设置?

编辑一些更详细的一个例外:

ystem.Net.WebSockets.WebSocketException (0x80004005):远端没有完成关闭握手就关闭了WebSocket连接。---> System.IO.IOException: 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机没有响应---> System.Net.Sockets.SocketException : 连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应

还有来自wireshark的一些信息

在此处输入图像描述

标签: signalr

解决方案


最后,我通过实现客户端 ping 解决了这个问题。我每十秒钟在服务器集线器上调用一个 void Ping() 方法,一切都很好。


推荐阅读