Entonces, quiero enviar un mensaje a un cliente específico a través de SignalR. Ese cliente no es Clients.Caller; actualmente solo puedo identificarlo llamándolo "ID", una propiedad en el contexto: this.Context.Items["ID"]
Entonces, para encontrar un cliente por su ID, ¿cómo... accedo a todos los clientes o contextos? ¿O debo guardar esta identificación de una manera diferente? Este no es el ID de conexión, es un ID que se asigna a algo en la base de datos.
Básicamente me gustaría ir Clients.Single(c => c.Items["ID"] == specificId).SendMessage(msg);
Puede enviar la ID a los clientes usando context.Clients.User(...) o context.Clients.All() . Luego, en JavaScript, lea la ID y compárela con lo que hay en la página. Si es un partido, realiza alguna acción; de lo contrario ignorar.
Como ejemplo, supongamos que su aplicación está procesando un registro específico en una pantalla de edición. El ID de registro está en la página como un campo de formulario. Envía un mensaje de SignalR desde C# con el ID. Haces una comparación en JavaScript entre el ID y el valor del campo de formulario; si coinciden, muestra un mensaje tostador, realiza otro procesamiento, etc.
En el método OnConnectedAsync de su concentrador, puede agrupar a un usuario por su "ID" cada vez que se conecte.
P.EJ:
public async override Task OnConnectedAsync() { var currentUserId = /*get your current users id here*/ await Groups.AddToGroupAsync(Context.ConnectionId, $"user-{currentUserId}"); await base.OnConnectedAsync(); }Luego, cuando necesite enviar un mensaje a esa persona, puede transmitirlo a su grupo 'personal'. (Una persona puede tener varias conexiones, por lo que el enfoque grupal funciona perfectamente para nosotros).
P.EJ:
Clients.Group($"user-{userId}").SendAsync("UserSpecificMessage", message);Cuando los usuarios se desconecten, SignalR manejará la eliminación de conexiones de los grupos automáticamente.
Al usar este enfoque, no tenemos que transmitir innecesariamente un mensaje a cada cliente con la intención de que solo un cliente filtre el mensaje en función de la identificación.