SignalR 是否可以在客户端断开连接时对消息进行排队,并在客户端重新连接时将其重新发送到客户端?



我们目前使用 SignalR 在 UI 客户端上从后端接收实时消息。UI 客户端在联机并连接到 SignalR 时接收消息,并在断开连接时错过消息(例如:用户关闭页面,SignalR 断开客户端连接(。 但是,现在我们需要向用户显示所有消息,包括 UI 客户端脱机时 SignalR 发送的消息。SignalR 能否支持此方案? 该要求类似于 UI 客户端消息的持久队列,但我们使用 SignalR 将消息广播到所有客户端。

SignalR 不支持此方案,您需要自行执行此操作。您需要存储消息并实现将挂起的数据发送到连接的客户端的中心方法。所以你需要做的是:

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

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

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

和集线器获取数据的方法:

公共异步任务<操作结果>获取通知异步(组组( { IListdata = 等待此。DataManager.GetDataForThisClientAsync(groups(.ConfigureAwait(false(; 如果(数据。计数 != 0( { 发送通知 foreach (数据中的 MyData 数据( { 等待这个。BroadcastDataToCallerAsync(data(.ConfigureAwait(false(; } } 返回 OperationResult.Success((; }

最新更新