我注意到在某些情况下,SignalR无法识别传输层的断开连接事件。如果正常断开传输,通过将VPN连接丢弃到服务器,或者发出ipconfig / release,将触发相应的事件。如果我连接到VPN并且我拔掉网络电缆或关闭无线网络,则SignalR无法识别出在VPN连接超时之前我们已断开连接。这是最可接受的,因为它最终实现了它。但是,如果我不使用VPN,只需拔下网络电缆或关闭无线网络,SignalR就不会识别出发生断开连接。这是在非CORS环境中通过WebSockets使用SignalR 2.0.1。如果我在集线器中启用日志记录,我会在等待超过5分钟后看到控制台中没有记录任何事件。在启动期间我在日志中看到的困扰我的一件事是:
SignalR: Now monitoring keep alive with a warning timeout of 1600000 and a connection lost timeout of 2400000.
这是我的问题吗?我已尝试手动将GlobalHost.Configuration.DisconnectTimeout设置为30秒,但它不会更改此方案中的任何行为,也不会更改该日志语句。还有什么我可以在这里俯瞰?
编辑:我在fiddler中注意到我的协商响应的断开超时为3600,keepalive为2400,并且trywebsockets为false。这个特殊的服务器是2008 R2,我不相信支持Web套接字。这是否意味着将使用长轮询?我不会在小提琴手或控制台中看到任何长时间的轮询请求。
答案 0 :(得分:1)
超时设置是我的问题。我不确定为什么我在调整设置时原本没有看到日志记录输出的变化,但我回到示例应用程序并看到事情发生了变化,现在情况正常。
应该注意,SignalR的默认设置在记录输出中产生以下语句,并且以毫秒为单位进行测量。
SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332 and a connection lost timeout of 20000
当您阅读以下页面中的传输断开方案下的信息时,这一点很明显:The default keepalive timeout warning period is 2/3 of the keepalive timeout. The keepalive timeout is 20 seconds, so the warning occurs at about 13 seconds.