多个选项卡的 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);
}
我希望这会对某人有所帮助。
我编写了一个使用 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);
}
我希望这会对某人有所帮助。