Frage

Ich teste SignalR (0.4.0 über Nuget) und kann keine Möglichkeit finden, den Server zwangsweise vom Client zu trennen.Ich nehme an, ich vermisse etwas Offensichtliches.

Mein Testcode ist unten und ich habe sowohl Close () als auch Timeout () an so ziemlich jedem Ort und in jeder Kombination ausprobiert, an die ich denken kann, ohne Erfolg.Der Client empfängt weiterhin Impulsnachrichten, obwohl ich innerhalb der ersten 4 bis 5 Sekunden immer zwei erneute Verbindungen erhalte, die anscheinend von return Connection.Close() in OnReceivedAsync() stammen

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

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

Beispiel für eine Client-Ausgabe:

d7615b15-f80c-4bc5-b37b-223ef96fe96c-Verbindung
Hallo
Puls
Puls
d7615b15-f80c-4bc5-b37b-223ef96fe96c Wiederverbindung
Puls
Puls
d7615b15-f80c-4bc5-b37b-223ef96fe96c Wiederverbindung
Puls
Puls
Puls
Puls
Puls
Puls
...

War es hilfreich?

Lösung

Senden Sie eine bestimmte Zeichenfolge an den Client, um die Trennung zu erzwingen:

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

    Console.WriteLine(data);
}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top