【问题标题】:signalR with multiple client connections具有多个客户端连接的 signalR
【发布时间】:2019-09-12 01:56:17
【问题描述】:

我编写了一个使用 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
}

C# 中的 MyHub 类

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);
}

【问题讨论】:

  • 你的意思是你打开新标签?
  • 是的,你是对的。打开新标签
  • 这是正常行为,如果您打开另一个浏览器,您可以建立新的连接

标签: c# asp.net-core signalr


【解决方案1】:

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

根据您提供的代码,我们可以发现您只需将当前活动浏览器选项卡/窗口中 SignalR 客户端的连接 ID 传递给您的控制器,并在您的控制器操作中,您使用此代码 sn-p .Client(queryParams.ConnectionId).SendAsync() 到将消息发送到特定客户端,因此其他浏览器窗口或选项卡将不会收到该消息。

如果您想向具有多个连接的客户端发送消息,您需要将 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); 

【讨论】:

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