当我将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吗?
答案 0 :(得分:2)
您必须先进行初始连接。
根据David Fowl的说法
...如果连接首先无法启动,那么它 不会自动重新连接。
他还说这已经完成......
因为它是一个更自然的API。如果您连接到的服务 失败的机会是非常错误的。如果你是在连接 某些点和连接断开,信号器将重试一个 一点点然后放弃和断开。他们是非常不同的 场景,我们试图保持连接,如果有昙花一现 网络,但没有完全无法启动连接。那 行为更可预测。
此外,here is a really awesome SO post详述了一系列不同的断开连接方案
答案 1 :(得分:1)
我认为你可能会混淆两件不同的事情 - 开始与传输回退和重新连接的连接。如果您没有明确说明要使用哪种传输,SignalR客户端将尝试使用所有可用传输(websockets,服务器发送事件,长轮询和永久帧(JS客户端))进行连接。如果启动与给定传输的连接失败,客户端将尝试使用它用于先前传输的相同数据(URL,cookie等)从列表中使用下一个传输。在这种意义上,不需要用户干预来尝试不同的传输。但是,如果启动与最后一次传输的连接失败,客户端将放弃并抛出异常。换句话说 - 客户端不会重新尝试与已经失败的传输建立连接。
成功启动连接后,如果连接丢失,客户端将尝试重新连接。在这种情况下,它将使用最初连接到服务器的相同传输,并且不会尝试使用其他传输。如果客户端在一定时间内无法使用此传输重新连接到服务器,则将关闭连接。