signalr - 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的一些信息
解决方案
最后,我通过实现客户端 ping 解决了这个问题。我每十秒钟在服务器集线器上调用一个 void Ping() 方法,一切都很好。
推荐阅读
- java - 如何在java中将向量的向量存储到二维数组中
- spring-boot - 使用 maven 构建与导出可运行 jar 的 jar 差异
- c# - 从 SQL 选择查询创建 XML
- ios - 在 iOS 中使用 Swift 导出 16 位图像
- python - 将行与所有先前行进行比较
- javascript - Webpack - 带有单个打包 js 文件的多页应用程序
- spring-boot - 在“测试范围”中基于maven启动Spring Boot Application
- .net - 如何在 Xamarin.Forms 的 XAML 中设置最小宽度或更大
- python - 创建一个简单的数据库来存储和加载随机数的高维 numpy 数组的好方法是什么?
- javascript - 为什么 parseInt 向 toFixed 返回不同的结果?