具有多个客户端连接的 signalR

signalR with multiple client connections

我编写了一个使用 SignalR 的应用程序。我正在将 connectionId 从客户端发送到服务器(控制器)。

单个浏览器一切正常(请求将发送到带有 connectionId="conn_1" 的服务器)并且 signalR 仅向 conn_1 发送响应,但是当我打开新浏览器并发送请求时从该客户端,先前的连接被处理掉。这意味着只有一个具有特定 connectionId 的连接保持活动状态。

有什么方法 SignalR 不能用他们想要的数据来处理和发送响应吗?

我是 SignalR 的新手,非常希望得到任何帮助或指导。

Angular SignalRService 开始与服务器连接

  this.hubConnection = new signalR.HubConnectionBuilder()
    .withUrl(this.paymentDraftHubUrl)
    .build();

  return this.hubConnection
    .start()
    .then(() => this.hubConnectionStatus = 'Connection started')
    .catch(err => (this.hubConnectionStatus = 'Error while starting connection: ' + err));
}

正在将 connectionId 从客户端组件发送到 Api

this.signalRService.startConnection().then((connection) => {
      this.connectionId = connection.toString();

      //Calling Api
      this.getAllTransactionException(
        this.connectionId,
        this.pageNumber,
        this.pageSize
}

MyHub class C#

public class PaymentDraftServiceHub : Hub, IPaymentDraftHub
{}

控制器 API 使用计时器不断调用存储库获取新数据,

[HttpGet]
[Route("GetCsrTranactions")]
public IActionResult GetCsrTranactions([FromQuery] TransactionExceptionDataRequest queryParams)
{
    TimeManager.Dispose();
    var timerManager = new TimeManager(async () =>
    await _paymentDraftHub.Clients.Clients.Client(queryParams.ConnectionId).SendAsync(SignalRConstants.TransferPaymentDraftServiceData, await _paymentTransactionRepository.GetCsrTranactionsAsync(queryParams)));
    var response = new ResponseMessage { Message = "Accepted", Code = "201" };
    return Ok(response);
}

如果客户端从多个浏览器 windows 或选项卡连接,则客户端可以有多个具有多个连接 ID 的连接。

根据您提供的代码,我们可以发现您只是将当前活动浏览器中 SignalR 客户端的连接 ID tab/window 传递给您的控制器,并且在您的控制器操作中,您使用此代码片段 .Client(queryParams.ConnectionId).SendAsync() 向特定客户端发送消息,因此其他浏览器 windows 或标签不会收到消息。

如果您想向具有多个连接的客户端发送消息,您需要将 SignalR 用户映射到连接 ID 并保留有关用户到连接 ID 映射的信息,然后您可以获得所有连接 ID一个客户端并使用多个 connectionId 向该客户端发送消息,如下所示。

//code logic here 
//to get all connectinIds of a client/user
//from user-to-connectionIds mapping table

await _paymentDraftHub.Clients.Clients(connectionIds_here).SendAsync("method_here",args_here);