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 al ConnectionId, Caller, y Others 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