En la última versión de Asp.Net SignalR, se agregó una nueva forma de enviar un mensaje a un usuario específico, utilizando la interfaz "IUserIdProvider".
public interface IUserIdProvider
{
string GetUserId(IRequest request);
}
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Mi pregunta es: ¿Cómo sé a quién le envío mi mensaje? La explicación de este nuevo método es muy superficial. Y el borrador de la Declaración de SignalR 2.0.0 con este error y no se compila. ¿Alguien ha implementado esta función?
Más información: http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#IUserIdProvider
Abrazos.
Respuestas:
SignalR proporciona ConnectionId para cada conexión. Para encontrar qué conexión pertenece a quién (el usuario), necesitamos crear un mapeo entre la conexión y el usuario. Esto depende de cómo identifique a un usuario en su aplicación.
En SignalR 2.0, esto se hace mediante el uso incorporado
IPrincipal.Identity.Name
, que es el identificador de usuario que inició sesión según lo establecido durante la autenticación ASP.NET.Sin embargo, es posible que deba asignar la conexión con el usuario utilizando un identificador diferente en lugar de utilizar Identity.Name. Para este propósito, este nuevo proveedor se puede utilizar con su implementación personalizada para mapear al usuario con la conexión.
Ejemplo de asignación de usuarios de SignalR a conexiones mediante IUserIdProvider
Supongamos que nuestra aplicación utiliza un
userId
para identificar a cada usuario. Ahora, necesitamos enviar un mensaje a un usuario específico. TenemosuserId
ymessage
, pero SignalR también debe conocer el mapeo entre nuestro userId y la conexión.Para lograr esto, primero necesitamos crear una nueva clase que implemente
IUserIdProvider
:El segundo paso es decirle a SignalR que use nuestra
CustomUserIdProvider
implementación en lugar de la predeterminada. Esto se puede hacer en Startup.cs mientras se inicializa la configuración del concentrador:Ahora, puede enviar un mensaje a un usuario específico usando su
userId
como se menciona en la documentación, como:Espero que esto ayude.
fuente
app.MapSignalR();
global.asax antes de la autenticación.Aquí es un comienzo ... Abierto a sugerencias / mejoras.
Servidor
JavaScript
(Observe cómo
addChatMessage
ysendChatMessage
también son métodos en el código del servidor anterior)Pruebas
fuente
Así es como se usa SignarR para dirigirse a un usuario específico (sin usar ningún proveedor):
fuente
contextIdClient
lo entendí :(Mire las pruebas de SignalR para la función.
La prueba "SendToUser" toma automáticamente la identidad del usuario pasada mediante el uso de una biblioteca de autenticación owin regular.
El escenario es que tiene un usuario que se ha conectado desde múltiples dispositivos / navegadores y desea enviar un mensaje a todas sus conexiones activas.
fuente
Hilo antiguo, pero me encontré con esto en una muestra:
fuente