连接到 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 加载或断开连接时,它应该向该提供者发出重新获得状态的请求,然后它应该重新连接到集线器。
如果数据一致性是个问题,您可以对状态进行版本控制,在用户界面中保留一份本地副本,然后在重新连接时进行审核。这样你就可以看到你是否错过了什么,在这种情况下你会向状态提供者发出追赶请求。
要处理事件,您只需在客户端的一些函数中 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/