2012-02-21 19 views
5

Estoy probando SignalR (0.4.0 a través de nuget) y no puedo encontrar ninguna forma de que el servidor desconecte forzosamente un cliente. Supongo que me estoy perdiendo algo obvio.Cómo desconecto con fuerza un cliente en SignalR

Mi código de prueba está a continuación y he intentado tanto Cerrar() y Tiempo de espera() en prácticamente cualquier lugar y combinación que se me ocurra sin éxito. El cliente sigue recibiendo mensajes de pulso, aunque yo siempre consigo 2 reconexiones dentro de los primeros 4-5 segundos que parecen provenir de return Connection.Close() en OnReceivedAsync()

Servidor:

internal class SignalRServer 
{ 
    private Server server; 

    public SignalRServer() 
    { 
     server = new Server("http://localhost:13170/"); 
     server.MapConnection<EchoConnection>("/echo"); 
     server.Start(); 
     Timer timer = new Timer(1000); 
     timer.Elapsed += OnTimer; 
     timer.Enabled = true; 
    } 

    void OnTimer(object sender, ElapsedEventArgs e) 
    { 
     IConnectionManager manager = server.DependencyResolver.GetService(typeof(IConnectionManager)) as IConnectionManager; 
     IConnection connection = manager.GetConnection<EchoConnection>(); 
     connection.Broadcast("pulse"); 
     connection.Close(); 
     connection.Timeout(); 
    } 
} 

internal class EchoConnection : PersistentConnection 
{ 
    protected override Task OnConnectedAsync(IRequest request, IEnumerable<string> groups, string connectionId) 
    { 
     Connection.Timeout(); 
     Connection.Close(); 
     return Connection.Broadcast(String.Format("{0} connection", connectionId)); 
    } 

    protected override Task OnReconnectedAsync(IRequest request, IEnumerable<string> groups, string connectionId) 
    { 
     return Connection.Broadcast(String.Format("{0} reconnection", connectionId)); 
    } 

    protected override Task OnReceivedAsync(string connectionId, string data) 
    { 
     Console.WriteLine(data); 
     Connection.Close(); 
     Connection.Timeout(); 
     Connection.Broadcast(data); 
     return Connection.Close(); 
    } 
} 

Cliente:

internal class SignalRClient 
{ 
    private readonly Connection connection; 

    public SignalRClient() 
    { 
     connection = new Connection("http://localhost:13170/echo"); 
     connection.Received += OnReceive; 
     connection.Closed += OnClosed; 
     connection 
      .Start() 
      .ContinueWith(t => 
      { 
       if (!t.IsFaulted) 
        connection.Send("Hello"); 
       else 
        Console.WriteLine(t.Exception); 
      }); 


     Console.WriteLine(connection.ConnectionId); 
    } 

    void OnClosed() 
    { 
     // never called 
     connection.Stop(); 
    } 

    void OnReceive(string data) 
    { 
     Console.WriteLine(data); 
    } 
} 
salida del cliente

muestra:

d7615b15-f80c-4bc5-b37b-223ef conexión 96fe96c
Hola
pulso
pulso
d7615b15-f80c-4bc5-b37b-223ef96fe96c reconexión
pulso
pulso
d7615b15-f80c-4bc5-b37b-223ef96fe96c reconexión
pulso
pulso
pulso
pulso
pulso
pulso
...

Respuesta

1

enviar una cadena específica para el cliente para forzar la desconexión:

void OnReceive(string data) 
{ 
    if(data.Equals("exit")) 
    { 
     connection.Stop(); 
     return; 
    } 

    Console.WriteLine(data); 
} 
+0

Gracias, que va a funcionar, pero me sorprende que no hay nada construido en el origen de la. El método Close() sugiere que envíe un mensaje al cliente para que se desconecte, pero no puedo hacerlo realmente. – Adster

+1

Es un error en el cliente .net. ¿Por qué intentas forzar la conexión cerca? – davidfowl

+0

@dfowler Estoy construyendo una aplicación proxy para ubicarme entre un servidor basado en socket existente y un cliente web móvil. Si el socket se cierra en el servidor, quiero transmitir esa desconexión al cliente. Iré con la sugerencia de nmat por ahora y probaré close() nuevamente cuando tenga un cliente JS real para probar. Aclamaciones – Adster

Cuestiones relacionadas