Pregunta

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

Mi código de prueba está a continuación y he probado Close () y TimeOut () en casi todos los lugares y combinaciones que puedo pensar sin éxito. El cliente continúa recibiendo mensajes de pulso, aunque siempre obtengo 2 reconexiones en los primeros 4-5 segundos que parecen provenir 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);
    }
}

Ejemplo de salida del cliente:

D7615B15-F80C-4BC5-B37B-223EF96FE96C Conexión
Hola
legumbres
legumbres
D7615B15-F80C-4BC5-B37B-223EF96FE96C Reconexión
legumbres
legumbres
D7615B15-F80C-4BC5-B37B-223EF96FE96C Reconexión
legumbres
legumbres
legumbres
legumbres
legumbres
legumbres
...

¿Fue útil?

Solución

Envíe una cadena específica al cliente para forzar la desconexión:

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

    Console.WriteLine(data);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top