【问题标题】:Can SignalR queue up messages when client is disconnected and resend them to client when client connects back?SignalR 可以在客户端断开连接时对消息进行排队,并在客户端连接回来时将它们重新发送给客户端吗?
【发布时间】:2020-10-13 00:30:02
【问题描述】:

我们目前使用 SignalR 在 UI 客户端上从后端接收实时消息。 UI 客户端在联机并连接到 SignalR 时接收消息,并在断开连接时错过消息(例如:用户关闭页面并且 SignalR 断开客户端连接)。 但是,现在我们需要向用户显示所有消息,包括在 UI 客户端离线时 SignalR 发送的消息。 SignalR 可以支持这种情况吗? 该要求类似于 UI 客户端消息的持久队列,但我们使用 SignalR 向所有客户端广播消息。

【问题讨论】:

    标签: signalr signalr-hub signalr.client asp.net-core-signalr signalr-backplane


    【解决方案1】:

    SignalR 不支持这种情况,需要自己做。您需要存储消息并实现一个集线器方法,将待处理的数据发送到连接的客户端。所以你需要做的是:

    • 使用readby 选项将数据保存在一些易失性存储中,这样您就可以看到已经发送到客户端的数据并将其删除。
    • Hub 方法,将数据发送到客户端,客户端响应接收到数据。
    • 当客户端断开连接时,将发送所有未由集线器发送的数据的集线器方法。

    代码示例,在客户端,连接并获取之前的数据:

    /**
    * Connect signalR and get previous data
    */
    private async connectSignalR() {
      await this.hubMessageConnection.start()
        .then(() => {
          // Register application
          this.GetDataForThisClientAsync();
        }).catch(() => {
          this.onError.emit(WidgetStateEnum.connectError);
        });
    }
    

    以及获取数据的hub方法:

    公共异步任务 GetNotificationsAsync(Groups groups)
    {
        IList 数据 = 等待 this.DataManager.GetDataForThisClientAsync(groups).ConfigureAwait(false);
    
        如果(数据。计数!= 0)
        {
            // 发送通知
    
            foreach(数据中的 MyData 数据)
            {
                等待 this.BroadcastDataToCallerAsync(data).ConfigureAwait(false);
            }
        }
    
        返回 OperationResult.Success();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多