我终于明白了.以下是我从这个问题开始学到的:
Background:我们正在使用Xamarin/Monotouch和.NET SignalR 2.0.3客户端构建一个iOS应用程序.我们使用的是默认的SignalR协议--它似乎使用的是SSE而不是Web套接字.我还不确定是否可以将web套接字与Xamarin/Monotouch一起使用.所有东西都是使用Azure网站托管的.
我们需要应用程序来快速重新连接到我们的SignalR服务器,但是我们总是遇到连接不能自动重新连接的问题--或者重新连接正好花了30秒(由于底层协议超时).
我们最终测试了三个场景:
Scenario A - connecting the first time the app was loaded.这从第一天起就完美无瑕.即使通过3G移动连接,连接也只需不到0.25秒即可完成.(假设 radio 已经开着)
Scenario B - reconnecting to the SignalR server after the app was idle/closed for 30 seconds.在这种情况下,Signal客户端最终将自行重新连接到服务器,而无需任何特殊工作,但它似乎要等待整整30秒才能try 重新连接.(对我们的应用来说太慢了)
在这30秒的等待时间里,我们try 拨打HubConnection.Start()没有效果.打电话给Hubbonnection.Stop()也需要30秒.我找到了a related bug on the SignalR site that appears to be resolved个,但我们在v2中仍然有同样的问题.0.3.
Scenario C - reconnecting to the SignalR server after the app was idle/closed for 120 seconds or longer.在这种情况下,信号传输协议已经超时,因此客户端永远不会自动重新连接.这就解释了为什么客户端有时会自行重新连接,但并不总是这样.好消息是,打电话给HubConnection.Start()几乎可以像场景A一样立即工作.
所以我花了一段时间才意识到,基于应用程序是否关闭了30秒和120多秒,重新连接的条件是不同的.尽管SignalR跟踪日志(log)说明了底层协议的情况,但我认为没有办法在代码中处理传输层事件.(在场景B中,Closed()事件在30秒后触发,在场景C中立即触发;State属性在这些重新连接等待期间显示为"Connected";没有其他相关事件或方法)
Solution: