2012-02-21 17 views
5

Sto testando SignalR (0.4.0 via nuget) e non riesco a trovare alcun modo per fare in modo che il server scolleghi forzatamente un client. Presumo mi manchi qualcosa di ovvio.Come disconnettere forzatamente un client in SignalR

Il mio codice di prova è sotto e ho provato sia Close() che Timeout() praticamente in ogni posto e combinazione che riesco a pensare senza successo. Il cliente continua a ricevere messaggi di impulso, anche se io non sempre ottenere 2 reconnections entro i primi 4-5 secondi che sembrano provenire da return Connection.Close() in OnReceivedAsync()

Server:

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); 
    } 
} 
uscita client

Esempio:

d7615b15-f80c-4bc5-b37b-223ef collegamento 96fe96c
Ciao
impulso
impulso
d7615b15-f80c-4bc5-b37b-223ef96fe96c riconnessione
impulso
impulso
d7615b15-f80c-4bc5-b37b-223ef96fe96c riconnessione
impulso
impulso
impulsi
impulso
impulso
impulso.210 ...

risposta

1

inviare una stringa specifica per il cliente a forzare la disconnessione:

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

    Console.WriteLine(data); 
} 
+0

Grazie, che funzionerà, ma sono sorpreso non c'è nulla di costruito in La fonte per il. Il metodo Close() suggerisce di inviare un messaggio al client per disconnettersi, ma non posso farlo per farlo davvero. – Adster

+1

È un bug nel client .net. Perché stai provando a forzare la connessione? – davidfowl

+0

@dfowler Sto costruendo un'app proxy per sedermi tra un server basato su socket esistente e un client web mobile. Se il socket si chiude sul server, desidero inoltrare tale disconnessione al client. Vado con il suggerimento di nmat per ora e testare di nuovo() di nuovo quando ho un client JS reale da testare contro. Saluti – Adster

Problemi correlati