javascript - 多日持久信号器连接模式

标签 javascript signalr

连接到 SignalR 并在页面上永久保持链接的正确 JavaScript 模式是什么,无论人们是否休眠计算机或互联网连接不稳定。

文档只是说使用:

$.connection.hub.start()
    .done(function(){ console.log('Now connected, connection ID=' + $.connection.hub.id); })
    .fail(function(){ console.log('Could not Connect!'); });
});

但这似乎没有考虑断开连接和其他问题。

另外,也没有捕捉到session过期需要重新登录的问题。

最佳答案

鉴于 SignalR 是基于连接的客户端/服务器解决方案,您不能期望长期持续打开连接。因此,正如 Kelso Sharp 在他的回答中所写,您唯一能做的就是管理连接生命周期的事件。

查看 signalR 连接的所有生命周期事件的文档: https://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client#connectionlifetime

因此,如果我们不将注意力集中在如何建立永不失败的持久连接上,我们可以通过在后台巧妙地管理断开连接、重新加载等操作,专注于给用户留下这样的印象。

这是一个图表,显示了我将如何设置它,即使您没有指定导致您的中心将数据推送到客户端的原因,但我认为它可能类似于此图表。这里的想法是你将相同的状态推送到某种状态提供者——即缓存、web api 存储,这样你就可以在任何给定时间获得整套数据。当 ui 加载或断开连接时,它应该向该提供者发出重新获得状态的请求,然后它应该重新连接到集线器。

如果数据一致性是个问题,您可以对状态进行版本控制,在用户界面中保留一份本地副本,然后在重新连接时进行审核。这样你就可以看到你是否错过了什么,在这种情况下你会向状态提供者发出追赶请求。

Pattern for faking persistent connection

要处理事件,您只需在客户端的一些函数中 Hook : //这将触发连接周期中的所有状态更改:

$.connection.hub.stateChanged(function (change) {
    if (change.newState === $.signalR.connectionState.reconnecting) {
        console.log("liveFeed is reconnecting!");
    }
    else if (change.newState === $.signalR.connectionState.connected) {
        console.log("liveFeed is connected!");
    }
});

//断开与集线器的连接时触发。

$.connection.hub.disconnected(function () {
   console.log('Connection disconnected')
});

关于javascript - 多日持久信号器连接模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40172346/

相关文章:

javascript - 使用 Reflect ES6 获取子属性

javascript - Vue 内联返回方法

javascript - 按键/值合并对象数组

javascript - 如何在 mousedown、mousemove 上覆盖默认的 "text"光标?

c# - 从 Controller 方法调用 signalR 服务器方法时出错

delphi - Delphi 或 C++Builder 中的 SignalR

signalr - 无法成功初始化任何传输。尝试为自动初始化指定不同的传输方式或根本不指定传输方式

javascript - 像在 Perl 中一样在 JavaScript 正则表达式中嵌入注释

ios - 从 Mac 中的 ios 客户端调用 PC 中的 signalR 服务器

c# - 登录时存储用户然后按需推送数据