多个选项卡的 SignalR 问题

SignalR issue with multiple tab

我编写了一个使用 SignalR 的应用程序。我有搜索按钮可以根据搜索条件获取数据。 (例如,如果您输入客户名称并单击搜索,所有与客户名称相关的数据将填充到屏幕上的网格中)

一切正常,如果我只打开一个浏览器。但是如果我打开同一个浏览器的第二个实例,当我在新的浏览器选项卡上使用 TransactionDate 进行搜索时,它会复制第一个中的内容,即使它只适用于第二个。

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

Angular SignalRService 开始与 api

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

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

C# 中的集线器 class

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.All.SendAsync(SignalRConstants.TransferPaymentDraftServiceData, await _paymentTransactionRepository.GetCsrTranactionsAsync(queryParams)));
    var response = new ResponseMessage { Message = "Accepted", Code = "201" };
    return Ok(response);
}

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

Clients.All 您在控制器中使用的方法将向所有当前连接的客户端发送消息。

要仅向呼叫者发送消息,您可以改用 Clients.Caller。 SignalR 在选择特定客户端时提供了更大的灵活性,您可以在 SignalR Documentation page 中阅读更多相关信息。

我已经理解@krish 在他的回答中发布的文档,并准备了我的解决方案来处理不同的连接并向特定的 connectionId 发送响应。我还需要通过连接获得不同的参数,因此我还必须将参数保存到字典中。

中心代码

public string GetCsrTransactions(TransactionExceptionDataRequest queryParams)
{
   if (Context.Items.TryGetValue(Context.ConnectionId, out _))
   {
     Context.Items.Remove(Context.ConnectionId);
     Context.Items.Add(Context.ConnectionId, queryParams);
   }
   else
   {
     Context.Items.Add(Context.ConnectionId, queryParams);
    }

    foreach (var item in Context.Items)
    {
      var isFounded = _disconnectedConnection.TryGetValue((string)item.Key, out _);
      if (!isFounded)
         _disconnectedConnection.Add((string)item.Key, queryParams);
      else
        {
          _disconnectedConnection.Remove((string)item.Key);
          _disconnectedConnection.Add((string)item.Key, queryParams);
         }
    }

    DataManager.Dispose();
    new DataManager(async () =>
    {
      var list = new Dictionary<string, TransactionExceptionDataRequest>(_disconnectedConnection);
      foreach (var item in list)
       {
        await _paymentDraftHub.Clients.Client(item.Key)
                            .SendAsync(SignalRConstants.TransferPaymentDraftServiceData,

        _paymentTransactionRepository.GetCsrTranactionsAsync(item.Value));
         }
        });
      return Context.ConnectionId;
  }

public override async Task OnConnectedAsync()
{
   await base.OnConnectedAsync();
}

public override async Task OnDisconnectedAsync(Exception exception)
{
   Context.Items.Remove(Context.ConnectionId);
   await base.OnDisconnectedAsync(exception);
}

我希望这会对某人有所帮助。