acceso Context.Connection ID fuera del centro en SignalR
Quiero poder enviar un mensaje a una cuenta de usuario específica con SignalR.
¡Ahora mismo puedo enviar a todos!
Estoy buscando cualquier manera de tener acceso al contexto. ConnectionID en el controlador fuera del centro. Traté de acceder a él dentro del controlador con iHubContext y dentro del centro intenté ahorrar valor de connectionID en sesión pero ambos no son compatibles.
¿Cuál sería la mejor manera de acceder a ConnectID desde Controller fuera del Hub?
aquí es el método de acción de ChatController que se utiliza para enviar mensaje a todos
public IActionResult PosaljiPoruku()
{
_hubContext.Clients.All.SendAsync("PrimljenaPoruka", "aaa");
return PartialView("SubmitFormPartial");
}
Cualquier ayuda es apreciada!
¡Gracias por intentar ayudar!
Pregunta hecha hace 3 años, 4 meses, 27 días - Por quantumquill
3 Respuestas:
-
¿Cuál sería la mejor manera de acceder a ConnectID desde Controller fuera del Hub?
Desde este doc acerca de enviar mensajes desde fuera de un centro, usted encontraría:
Cuando los métodos del hub son llamados desde fuera del
Hub
clase, no hay callador asociado con la invocación. Por lo tanto, no hay acceso alConnectionId
,Caller
, yOthers
propiedades.Quiero poder enviar un mensaje a una cuenta de usuario específica con SignalR.
Usted puede mapear usuario y
ConnectionId(s)
mientras que cliente conectado al servidor Hub, entonces si desea enviar un mensaje al usuario específico de la acción del controlador fuera de su Hub, puede consultar tabla de asignación para obtener la conexión correspondiente Id(s) primero basado en el nombre de usuario, etc, y pasar la conexión Id(s) al método de acción.await _hubContext.Clients.Client("connection_id_here").SendAsync("PrimljenaPoruka", "aaa");
Además, se puede lograr lo mismo creando un grupo de usuarios únicos (un grupo para cada usuario), y luego enviar un mensaje a ese grupo cuando desea llegar sólo a ese usuario específico.
await _hubContext.Clients.Group("group_name_here").SendAsync("PrimljenaPoruka", "aaa");
Respondida el Dec 18, 2020 a las 13:45 - por compilercaptain7dab
Votos positivos: 0 | Votos negativos: 0 -
Para poder enviar un mensaje a un usuario específico desde un controlador fuera del Hub en SignalR, puedes seguir los siguientes pasos:
- Registra el servicio IHubContext en el pipeline de DI de ASP.NET Core:
csharp services.AddSignalR();
- Inyecta el servicio IHubContext en tu controlador:
csharp private readonly IHubContext
_hubContext; public ChatController(IHubContext
hubContext) { _hubContext = hubContext; } - Utiliza el método Clients.Client para enviar mensajes a usuarios específicos:
csharp public IActionResult PosaljiPoruku(string userId) { var connectionId = GetConnectionIdForUser(userId); if (connectionId != null) { _hubContext.Clients.Client(connectionId).SendAsync("PrimljenaPoruka", "aaa"); } return PartialView("SubmitFormPartial"); }
private string GetConnectionIdForUser(string userId) { // Aquí debes implementar la lógica para obtener el connection ID del usuario especificado // Por ejemplo, puedes almacenar los connection IDs de los usuarios en un diccionario // y luego recuperar el valor según el ID de usuario }
Con estos pasos, podrás enviar mensajes a usuarios específicos desde tu controlador utilizando SignalR. Recuerda implementar la lógica para obtener el connection ID del usuario especificado de acuerdo a tu aplicación. Espero que esta información te sea útil. ¡Déjame saber si tienes alguna otra pregunta!
Respondida el Dec 19, 2020 a las 13:48 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para acceder al
Context.ConnectionId
fuera del concentrador en SignalR, puedes utilizar la siguiente técnica:- Crea una clase de servicio que implemente la interfaz `IUserIdProvider`. Esta clase será responsable de proporcionar el identificador de usuario para el cliente conectado.
- En el concentrador, establece el `IUserIdProvider` utilizando el método `Context.SetItems`. Esto permitirá que el concentrador acceda al proveedor de identificadores de usuario.
- En el controlador, inyecta el `IUserIdProvider` y úsalo para obtener el identificador de conexión del cliente conectado.
Aquí tienes un ejemplo de cómo puedes implementar esto:
Clase de servicio UserService:
csharp public class UserService : IUserIdProvider { public string GetUserId(HubCallerContext context) { return context.ConnectionId; } }
Configuración en el concentrador:
csharp public class ChatHub : Hub { private readonly IUserIdProvider _userIdProvider; public ChatHub(IUserIdProvider userIdProvider) { _userIdProvider = userIdProvider; } public void Initialize() { Context.SetItems(_userIdProvider); } }
Acceso en el controlador:
csharp public class ChatController : Controller { private readonly IUserIdProvider _userIdProvider; public ChatController(IUserIdProvider userIdProvider) { _userIdProvider = userIdProvider; } public IActionResult SendMessage(string message) { var connectionId = _userIdProvider.GetUserId(User); // Envía el mensaje únicamente al cliente con el connectionId especificado _hubContext.Clients.Client(connectionId).SendAsync("ReceiveMessage", message); return Ok(); } }
Esto te permitirá enviar mensajes a clientes específicos utilizando su
ConnectionId
, que puedes acceder desde el controlador fuera del concentrador.Respondida el Dec 19, 2020 a las 13:55 - por Gemini
Votos positivos: 0 | Votos negativos: 0