SignalR Client HubConnection.Start()抛出异常并且不会像文档所说的那样继续尝试连接

时间:2015-12-11 20:57:27

标签: signalr signalr.client

当我将HubConnection.Start()调用到ISN' T UP AND RUNNING YET的端点时,我希望HubConnection可以做它应该做的任何事情来连续建立连接。至少我认为SignalR客户指南告诉我的是:

  

当您在SignalR客户端中调用Start方法时,您将为SignalR客户端代码提供所需的所有信息,以便建立与服务器的物理连接。 SignalR客户端代码使用此信息发出HTTP请求并建立使用四种传输方法之一的物理连接。如果传输连接失败或服务器发生故障,SignalR连接不会立即消失,因为客户端仍然拥有自动重新建立到同一SignalR URL的新传输连接所需的信息。在这种情况下,不涉及用户应用程序的干预,并且当SignalR客户端代码建立新的传输连接时,它不会启动新的SignalR连接。 SignalR连接的连续性反映在以下事实中:在调用Start方法时创建的连接ID不会更改。

然而,我没有看到这一点。 Start()抛出异常。即使我忽略它,然后启动我的服务器集线器,HubConnection也不会尝试再次连接。

我误解了指南吗?我必须首先在所有SignalR客户端重新连接逻辑发生之前成功连接FIRST吗?

2 个答案:

答案 0 :(得分:2)

您必须先进行初始连接。

根据David Fowl的说法

  

...如果连接首先无法启动,那么它   不会自动重新连接。

他还说这已经完成......

  

因为它是一个更自然的API。如果您连接到的服务   失败的机会是非常错误的。如果你是在连接   某些点和连接断开,信号器将重试一个   一点点然后放弃和断开。他们是非常不同的   场景,我们试图保持连接,如果有昙花一现   网络,但没有完全无法启动连接。那   行为更可预测。

以下是link to the github issue

此外,here is a really awesome SO post详述了一系列不同的断开连接方案

答案 1 :(得分:1)

我认为你可能会混淆两件不同的事情 - 开始与传输回退和重新连接的连接。如果您没有明确说明要使用哪种传输,SignalR客户端将尝试使用所有可用传输(websockets,服务器发送事件,长轮询和永久帧(JS客户端))进行连接。如果启动与给定传输的连接失败,客户端将尝试使用它用于先前传输的相同数据(URL,cookie等)从列表中使用下一个传输。在这种意义上,不需要用户干预来尝试不同的传输。但是,如果启动与最后一次传输的连接失败,客户端将放弃并抛出异常。换句话说 - 客户端不会重新尝试与已经失败的传输建立连接。

成功启动连接后,如果连接丢失,客户端将尝试重新连接。在这种情况下,它将使用最初连接到服务器的相同传输,并且不会尝试使用其他传输。如果客户端在一定时间内无法使用此传输重新连接到服务器,则将关闭连接。