Question

Je teste SignalR (0.4.0 via NuGet) et je ne trouve aucun moyen de faire en sorte que le serveur déconnecte avec force un client. Je suppose que je manque quelque chose d'évident.

Mon code de test est ci-dessous et j'ai essayé à la fois Close () et TimeOut () dans à peu près tous les lieux et combinaisons à laquelle je peux penser sans succès. Le client continue de recevoir des messages de pouls, bien que j'obtienne toujours 2 reconnexions dans les 4 à 5 premières secondes qui semblent provenir de return Connection.Close() dans OnReceivedAsync()

Serveur:

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();
    }
}

Client:

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

Exemple de sortie du client:

D7615B15-F80C-4BC5-B37B-223EF96FE96C
Bonjour
impulsion
impulsion
D7615B15-F80C-4BC5-B37B-223EF96FE96C Reconnection
impulsion
impulsion
D7615B15-F80C-4BC5-B37B-223EF96FE96C Reconnection
impulsion
impulsion
impulsion
impulsion
impulsion
impulsion
...

Était-ce utile?

La solution

Envoyez une chaîne spécifique au client pour forcer la déconnexion:

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

    Console.WriteLine(data);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top