[英]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));
}
從客戶端組件向Api發送connectionId
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);
}
如果客戶端從多個瀏覽器窗口或選項卡進行連接,則客戶端可以具有多個具有多個連接ID的連接。
根據您提供的代碼,我們可以發現您只是將當前活動瀏覽器選項卡/窗口中的SignalR客戶端的連接ID傳遞給了控制器,並且在控制器操作中,您使用了以下代碼段.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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.