2012-03-07 18 views
18

Quiero poder tener usuarios individuales que se envíen mensajes utilizando SignalR, por lo tanto, debo enviar un ID de cliente específico. ¿Cómo puedo definir la ID del cliente para un usuario específico al inicio de la sesión, por ejemplo, una clave principal GUID para el usuario?SignalR - Establecer ClientID manualmente

Respuesta

23

Reemplace el IConnectionIdFactory con su propio https://github.com/SignalR/SignalR/wiki/Extensibility.

uso de la muestra: http://www.kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/

EDITAR: Esta ya no se admite en las últimas versiones de SignalR. Sin embargo, se puede definir un identificador de usuario para una conexión específica utilizando el nuevo IUserIdProvider

+0

Excelente - gracias por la respuesta y el enlace del blog! – reach4thelasers

+2

¿Hay alguna manera de configurar manualmente la ID del cliente sin usar cookies? quizás un parámetro para el método de inicio() u otra forma de pasar información al objeto de solicitud en la fábrica de conexiones personalizadas? –

+1

Gracias por enlazar a mi blog! – 1kevgriff

3

El SignalR Client Side documentation esboza lo siguiente:

connection.id - Obtiene o establece el ID de cliente para la conexión actual

Esto sin duda indica que uno debe ser capaz de establecer el lado del cliente clientID, sin todas las tuberías anteriores. ¿Esto no funciona? Si funciona, ¿cómo se vería esta línea de código?

+0

No lo he intentado, pero necesito poder asignar la ID de conexión a algo conocido para el servidor, como un GUID (ID de usuario), por lo que la solución IConnectionFactory funciona mejor para mí. – reach4thelasers

+0

+1 para subirlo aunque – reach4thelasers

5

En SignalR versión 1 utilizando el enfoque de Hubs, anulo el método Hub OnConnected() y guardo una asociación de .NET membership userId con el ID de conexión actual (Context.ConnectionId) en una base de datos SQL.

Luego, anulo el método Hub OnDisconnected() y elimino la asociación entre el Id. De usuario de membresía .NET y el ID de conexión actual. Esto significa que en una página volver a cargar la asociación userId/connectionId estará actualizada.

Algo a lo largo de las líneas de:

public class MyHub : Hub 
{ 
    private MembershipUser _user 
    { 
     get { return Membership.GetUser(); } 
    } 

    private Guid _userId 
    { 
     get { return (Guid) _user.ProviderUserKey; } 
    } 

    private Guid _connectionId 
    { 
     get { return Guid.Parse(Context.ConnectionId); } 
    } 

    public override Task OnConnected() 
    { 
     var userConnectionRepository = new UserConnectionRepository(); 
     userConnectionRepository.Create(_userId, _connectionId); 
     userConnectionRepository.Submit(); 

     return base.OnConnected(); 
    } 

    public override Task OnDisconnected() 
    { 
     var userConnectionRepository = new UserConnectionRepository(); 
     userConnectionRepository.Delete(_userId, _connectionId); 
     userConnectionRepository.Submit(); 

     return base.OnDisconnected(); 
    } 
} 

Entonces cuando necesito para desencadenar un evento SignalR para un usuario específico, que puede resolver el ID de conexión de la asociación (s) base de datos con el ID de usuario actual - hay puede ser más de una asociación si hay varias instancias del navegador involucradas.

+0

¿Tiene un ejemplo de esto? – CR41G14

+0

He actualizado mi respuesta con un ejemplo –