用于多日持久信号器连接的模式

Cin*_*ine 6 javascript signalr

什么是正确的JavaScript模式连接到SignalR并在页面上永久保持链接,无论人们是否休眠他们的计算机或者有多少互联网连接.

文档只是说使用:

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

但这似乎并未将断开连接和其他问题考虑在内.

此外,它没有捕获会话过期的问题,需要重新登录.

Esp*_*pen 2

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

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

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

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

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

伪造持久连接的模式

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

$.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!");
    }
});
Run Code Online (Sandbox Code Playgroud)

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

$.connection.hub.disconnected(function () {
   console.log('Connection disconnected')
});
Run Code Online (Sandbox Code Playgroud)