【问题标题】:SignalR Client HubConnection.Start() throws exception and doesn't keep trying to connect like the documentation says it shouldSignalR Client HubConnection.Start() 抛出异常并且不会像文档所说的那样继续尝试连接
【发布时间】:2023-03-31 21:01:02
【问题描述】:

当我调用 HubConnection.Start() 到一个尚未启动和运行的端点时,我希望 HubConnection 会做它应该做的任何事情来持续建立连接。至少我认为 SignalR 客户指南是这样告诉我的:

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

但是,我没有看到这个。 Start() 引发异常。即使我忽略它,然后启动我的服务器集线器,HubConnection 也不会尝试再次连接。

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

【问题讨论】:

    标签: signalr signalr.client


    【解决方案1】:

    您必须先进行初始连接。

    根据大卫·福尔的说法

    ...如果连接一开始就无法启动,那么它 不会自动重新连接。

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

    因为它是一个更自然的 API。如果您连接到的服务是 下降的机会是真的有问题。如果您在 某个点并且连接断开,信号器将重试 一点点然后放弃并断开连接。他们非常不同 场景,如果出现信号,我们会尝试保持连接 网络,但在无法完全启动连接时不会。那 行为更容易预测。

    这里是link to the github issue

    另外,here is a really awesome SO post 详细介绍了一系列不同的断开连接场景

    【讨论】:

    • 谢谢。我知道手动实现逻辑并不是什么大不了的事,但如果它是为我完成的,我不想这样做。我仍然认为文档可能会更清晰。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,这是有道理的。但是,文档可能会更清晰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2021-04-05
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多