如何让 SignalR 在断开连接时表现得优雅

2024-01-09

我的应用程序经常会在糟糕的公司网络(代理、防火墙等)下使用,所以我不能依赖套接字,长轮询实际上是我唯一的选择。这是长轮询的最大问题:

  1. 长轮询在某个时间点断开连接
  2. 我自动重新连接(根据文档)
  3. 用户单击导致集线器方法调用的内容,但尚未建立连接 - 发生错误。

有没有办法同步集线器方法调用和重新连接,例如:

  1. 我调用集线器方法
  2. SignalR 发现连接尚未准备好
  3. 它会等到连接准备好并调用集线器方法

目前我还没有看到这样的机会,似乎我唯一的选择就是切换到 ajax 调用,这很遗憾。


我是如何处理的:

  • have a isConnected boolean在我的客户端上,以便每当我连接时,我将其设置为true,每当我断开连接时,我都会将其设置回false:

    $.connection.hub.start().fail((err) => { alert(err); }).done(() => this.isConnected = true); $.connection.hub.disconnected(() => { this.isConnected = false; }); $.connection.hub.reconnected(() => { this.isConnected = true; });

  • 现在,在调用集线器方法之前,我检查是否isConnected是真的。如果没有,我尝试启动集线器连接:

    $("#serverButton").click(function(){ if(this.isConnected==false) $.connection.hub.start(); $.connection.hub.server.serverMethod();
    })

这就是我现在处理此类情况的方式。 希望这可以帮助。祝你好运!

更新:实际上存在一个属性$.connection.hub called state您可以在连接期间的每个点进行访问。

因此,您可以通过检查来跳过拥有自己的变量的步骤(尽管我仍然使用它只是为了确定)$.connection.hub.state.

$.connection.connectionState Object {connecting: 0, connected: 1, reconnecting: 2, disconnected: 4}

输出来自$.connection.hub.state是上面的整数,但你可以这样做:$.connection.hub.state == $.signalR.connectionState.connected你可以有布尔值。

更简单,但每次调用集线器方法时仍然需要检查这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 SignalR 在断开连接时表现得优雅 的相关文章

随机推荐