具有多个客户端连接的 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);
我编写了一个使用 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);