2015-08-28 103 views
11

我正在与SignalR在非常具体的网络条件下(一个疯狂的代理)。所以套接字不工作,我必须使用长轮询。当我刷新页面时,它似乎工作了一段时间,但是第一次断开连接发生。我试图断开连接的情况下自动重新连接和下面的模式:SignalR奇怪的重新连接模式

  1. 页面后加载,在110秒左右枢纽断开(默认超时)
  2. 它需要3个断开事件后重新启动集线器第一次断开连接(所以它只连接第四次尝试)
  3. 之后,它总是在第一次尝试时重新连接,但在大约10-15秒(而不是110秒)后断开连接。所以它看起来像保持活跃超时在这里(尽管它不是第一次尝试)。

这种行为看起来很奇怪。我能做些什么来改善它吗?

+0

你能具体谈谈您的网络条件? –

+0

@BrendanGreen,它是一个带有一些代理(Webwasher)的企业网络,并且有很多东西被封锁(这是一个德国企业网络,你知道...) – SiberianGuy

+0

@BrendanGreen,你见过http:// www .asp.net/signalr/overview/guide-to-the-api/handling-connection-lifetime-events? SignalR的连接行为是'未定义的',您可以在短时间内观察到许多断开连接和重新连接,而没有明显的原因。该页面还提供了如何更改行为的指导,例如设置'GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110);' – gd73

回答

2

假设Understanding and Handling Connection Lifetime Events in SignalR中的提示可用于您根据网络问题使用良好解决方案来处理连接寿命。此外,在SignalR的问题中,我找到了适合您的以下解决方案,它也适用于长轮询。

您可以设置在ConfigurationManagerKeepAlive财产和SignalR将在指定的时间间隔发送数据的空架(基于运输),以保持连接(看Allow host to specify keep alive times)。目前的超时机制使得流协议没有什么不同。

+0

似乎默认启用KeepAlive – SiberianGuy

+0

@Idsa对于长以外的传输轮询,每隔10秒发送一次“keepalive”数据包。该值不得超过DisconnectTimeout值的1/3。 –

2

使用ConnectionStatusStream。当客户端SignalR集线器代理事件发生时,此OnNexts流。所以我们看到像连接,连接,ConnectionSlow,重新连接,重新连接,关闭,未初始化。所有这些都在SignalR集线器代理上作为事件开始生命,并且使用众多RX工厂之一转换为IObservable流。在这种情况下IObservable.FromEvent。

无论如何,这里是我们用来显示应用底部状态栏信息的整体ConnectivityStatusViewModel。

参见本:

ConnectionStatusStream

+0

我已经查看了代码。虽然这是一个很好的架构(虽然从未与RX一起工作过),但我不明白它是如何解决我描述的问题的 – SiberianGuy