2012-05-15 13 views

Respuesta

4

Puede implementar IConnected/IDisconnect en el concentrador y realizar un seguimiento de clientes manualmente, por ejemplo, en una base de datos, y luego retirar la lista cuando sea necesario. El siguiente ejemplo es de la SignalR Wiki

public class Status : Hub, IDisconnect, IConnected 
{ 
    public Task Disconnect() 
    { 
     return Clients.leave(Context.ConnectionId, DateTime.Now.ToString()); 
    } 

    public Task Connect() 
    { 
     return Clients.joined(Context.ConnectionId, DateTime.Now.ToString()); 
    } 

    public Task Reconnect(IEnumerable<string> groups) 
    { 
     return Clients.rejoined(Context.ConnectionId, DateTime.Now.ToString()); 
    } 
} 
4

¿Por qué habría una conexión de ID en el contexto global? ¿A qué conexión estaría en referencia? Cuando obtiene el contexto global, está accediendo a un canal unidireccional de servidor a cliente y puede enviar mensajes sobre él. No tiene acceso a la identificación de conexión del concentrador ya que no está llamando. Puede almacenarlos en algún lugar de su aplicación si necesita usarlos.

+2

No todo el mundo crea servidores de chat. Creo que implícita era cómo obtener ConnectionId utilizado por el cliente actual para enviar un mensaje a ese usuario/sesión. Me pregunto cómo hacer esto mejor en una Acción MVC desde un cliente en el que deseo enviar mensajes de progreso. Hay algunas técnicas para el almacenamiento en caché de ConnectionIds por el nombre de usuario, pero no he visto nada decente para permitir que el mismo usuario tenga múltiples conexiones, lo que a menudo es el caso con las aplicaciones web. Ideas para eso? Gracias. – Dave

+4

Lo envía desde el cliente a su acción de mvc. Está disponible en el cliente a través de $ .connection.hub.id. – davidfowl

1

Aquí está la solución. Puede invocar un método dentro del hub y puede devolver el connection ID desde allí.

En Controlador

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
MyHub _connectedHub= new MyHub(); 
var connectedUserID = _connectedHub.GetConnectionID(); 

En Hub

public string GetConnectionID() 
{ 
    return "Your Connection ID as String" //This can be stored in a list or retrieved in any other method 
} 

Obtendrá ID fuera del centro requiere en connectedUserID variable. Espero que esto ayude.