使用一个连接发送并发 SignalR 消息

Posted

技术标签:

【中文标题】使用一个连接发送并发 SignalR 消息【英文标题】:Send concurrent SignalR messages with one connection 【发布时间】:2022-01-06 11:56:43 【问题描述】:

如何仅通过一个连接并行发送多条 SignalR 消息?

我有以下集线器方法:

public async Task Test()  
  
    Console.WriteLine($"Start: DateTime.Now");  
    await Task.Run(() => Task.Delay(1000));  
    Console.WriteLine($"Stop: DateTime.Now");  
 

在我的客户端中,我有以下连接:

private connection: HubConnection = new HubConnectionBuilder()
  .withUrl(this.url)
  .configureLogging(LogLevel.Information)
  .withAutomaticReconnect([1000, 2000, 3000, 4000, 5000])
  .build();

我这样调用 hub 方法:

async test(): Promise<void> 
  try 
    console.log('start: ' + new Date().toString());
    await this.connection.invoke('Test');
    console.log('stop: ' + new Date().toString());
   catch (err) 
    console.error(err);
  

当我在客户端中多次调用测试方法时,集线器会一个接一个地接收消息,而不是一次接收所有消息。

客户端日志:

开始时间:2021 年 11 月 29 日星期一 17:27:35 GMT+0100 (3) 停止:2021 年 11 月 29 日星期一 17:27:36 GMT+0100 停止:2021 年 11 月 29 日星期一 17:27:37 GMT+0100 停止:2021 年 11 月 29 日星期一 17:27:38 GMT+0100

服务器日志:

开始:29.11.2021 17:27:35 停止:29.11.2021 17:27:36 开始时间:29.11.2021 17:27:36 停止:29.11.2021 17:27:37 开始时间:29.11.2021 17:27:37 停止:29.11.2021 17:27:38

【问题讨论】:

您尝试了多个同时的客户端还是仅来自单个客户端的跟踪? 您使用的是哪个版本的 Asp.net core SignalR?如果您使用的是 Asp.net core 5.0 或 6.0,您可以尝试配置 server MaximumParallelInvocationsPerClient 选项。此外,如果您使用的是以前的版本,来自同一连接的 Hub 方法将按顺序调用。如果您想支持并行处理,您可以让 Hub 方法启动一个后台进程,该进程在完成时调用客户端方法(使用 HubContext)。 @Caius Jard:上面的日志来自一个客户端。当使用多个客户端时,服务器会并行处理调用。 @Zhi Lv:谢谢!使用 MaximumParallelInvocationsPerClient 有效。 【参考方案1】:

为了允许每个客户端进行多个并行调用,您需要设置MaximumParallelInvocationsPerClient 属性,如下所示:

builder.Services.AddSignalR(options => options.MaximumParallelInvocationsPerClient = 10);

【讨论】:

以上是关于使用一个连接发送并发 SignalR 消息的主要内容,如果未能解决你的问题,请参考以下文章

利用SignalR创建即时消息

SignalR入门之持久性连接

SignalR 广播消息在停止/启动后重复

如何使用 SignalR 加入群组

在重新连接时检测丢失的消息/对消息的丢失操作

SignalR - 使用 (IUserIdProvider) *NEW 2.0.0* 向特定用户发送消息