【问题标题】:SignalR between initial load and updates初始加载和更新之间的 SignalR
【发布时间】:2015-07-15 18:51:14
【问题描述】:

我正在尝试使用 signalR 构建应用程序。申请大纲将是:

  • 从数据库加载初始状态
  • 订阅后续消息

我一直在寻找一组最佳实践。如果我在初始加载后订阅更新,则存在丢失更新的风险。在初始加载和订阅之间可能会有更新,而我会错过那个更新。

其次,我可以使用某种对象状态 ID,然后首先订阅更新流,检索数据,然后在对象落后时应用更新。这需要相当多的代码。

是否有任何最佳实践来处理这个问题?

【问题讨论】:

  • 您在这方面取得了进展吗?我的建议是否有助于引导您朝着正确的方向前进?

标签: javascript c# asp.net-mvc asp.net-web-api signalr


【解决方案1】:

根据您查询更新的时间,可能会有遗漏。例如,假设您的后端查询某些通知并将其推送到客户端,然后用户连接(订阅)通知 - 如果在此初始化阶段发送更新并错过,您推送的原始数据集可能已过时。

作为最佳实践,我发现放弃发送任何初始数据。相反,请尽快订阅并在成功连接时查询更新。比如……

var proxy = $.connection.yourHub;

$.connection.hub.start()
    .done(function () { // <--- immediately call once connected

        // define and call server hub method
        // this will query updates and immediately
        // invoke the associated client function

        proxy.server.queryUpdates();
    })
    .fail(function () {
        console.log('Could not connect!');
    });

proxy.client.serveUpdates = function(updates) {
    // here's your fetched updates on initial connect
}

// YourHub.cs
public void QueryUpdates()
{
    var updates = this.yourService.yourQueryUpdatesmethod();

    Clients.Caller.serveUpdates(updates) // this calls proxy.client.serveUpdates
}

这为您提供了建立连接、侦听更新以及在连接时以一次性方式有效地提供最新数据集的好处。

注意这不一定是 SignalR 特定的实现。您可以在此 .done() 回调中进行典型的 ajax 调用来检索结果,但我不明白为什么您不能重用集线器上已有的所有逻辑。您基本上可以通过从客户端显式调用它来调用现有的 hub 方法。

【讨论】:

    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 2017-09-29
    • 2021-03-09
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2012-12-27
    • 2016-01-28
    相关资源
    最近更新 更多