2014-07-22 4 views
13

Ich entwickle gerade eine Anwendung mit SignalR (2.1) Hubs.SignalR: Erkennung einer aktiven Verbindung in C# -Clients

Ich habe 1 WPF-Client und der andere ist ein WCF-Client. Alles funktioniert gut, indem sie die Nachrichten perfekt weitergeben.

Das einzige Problem, das ich jetzt konfrontiert ist, dass ich bemerkte, dass die OnDisconnected überhaupt nicht ausgelöst wird, wenn die Anwendung aus Gründen wie automatische Neustarts, WCF-Server und einige andere heruntergefahren wird. Das Zeitlimit ist der Standardwert von 30 Sekunden. Es wird nie aufgerufen, auch nachdem 1 Tag vergangen ist (ich habe es versucht). Die Zeitüberschreitung funktioniert jedoch für Web Clients.

Es funktioniert nur, wenn ich hub.connection.stop() aufrufen.

Die Ondisconnected-Methode funktioniert jedoch sehr gut, wenn der Client ein Browser ist.

Daher möchte ich fragen, ob es eine Möglichkeit für Signal R Hub gibt, um zu überprüfen, ob der Client noch verbunden ist oder bereits ausgefallen ist (z. B. ein Ping)?

+1

1) Sie sollten einen Fehler auf GitHub für den .Net-Signal-Client (oder vielleicht haben sie schon einen Fehler?). 2) Sie können einfach Ihren eigenen Ping-Mechanismus implementieren, indem Sie Mechanismen zwischen Clients und Hubs hin und her senden. –

+0

Nun, ich lese diesen Text durch und merke ihn: "Wenn Ihre Webserver nicht mehr funktionieren oder die Anwendung neu gestartet wird, wird die OnDisconnected-Methode nicht aufgerufen Daher ist es möglich, dass Ihr Daten-Repository Datensätze für Verbindungs-IDs enthält, die nicht mehr gültig sind. " in http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections. Daher weiß ich, dass sie davon wissen.Aber meine Frage ist, gibt es irgendwelche eingebauten Weg für den SignalR-Hub zu bemerken, wenn die Verbindung fallen gelassen wurde, anstatt mich alle paar Sekunden zu pingen. – Kiong

Antwort

23

In SignalR 2.1.0 gibt es eine new overload to OnDisconnected, die ein Bool dauert, das angibt, ob der Client ordnungsgemäß getrennt wurde oder nicht. Die Begründung für diese Änderung wird im Abschnitt "Breaking Changes" von 2.1.0 release notes erläutert.

Ihr neues OnDisconnected Methode wie folgt aussehen könnte:

public override Task OnDisconnected(bool stopCalled) 
{ 
    if (stopCalled) 
    { 
     // We know that Stop() was called on the client, 
     // and the connection shut down gracefully. 
    } 
    else 
    { 
     // This server hasn't heard from the client in the last ~35 seconds. 
     // If SignalR is behind a load balancer with scaleout configured, 
     // the client may still be connected to another SignalR server. 
    } 

    return base.OnDisconnected(stopCalled); 
} 

Die alte OnDisconnected Methode, die keine bool dauert nicht für nicht-anmutige trennt genannt, also wenn Sie dieses Ereignis verwenden, dass könnte das Problem erklären, das Sie sehen.

Vor Version 2.1.0 wurde die OnDisconnected-Methode, die keinen Parameter akzeptiert hat, für beide nichtlinearen Verbindungen und aufgerufen. Da diese Änderung im Verhalten several reported issues verursacht hat, ist die alte OnDisconnected-Überladung is being removed in SignalR's upcoming 2.1.1 release.

Dies führt dazu, dass Anwendungen, die die alte OnDisconnected-Methode von SignalR verwenden, nicht kompiliert werden können, wenn sie mit SignalR 2.1.1 erstellt werden. Obwohl dies nicht ideal ist, werden Entwickler hoffentlich auf diese bahnbrechende Änderung aufmerksam gemacht, so dass sie ihre Apps vor der Bereitstellung entsprechend anpassen können.

+0

Perfekt. Ich habe es gerade getestet und ja. Das feuert. Vielen Dank, mein Herr! – Kiong

+0

halter73, danke. Ich habe einen kleinen Fehler gefunden. OnDisconnected Methode wird nicht ausgelöst, wenn ich "virtual" in der nächsten Zeile verwende: public virtual Task OnDisconnected (bool stopCalled) Ich verwende "override" anstatt "virtual" und es funktioniert. –

+0

Danke. Ich habe meine Antwort korrigiert. – halter73

0

Ich habe festgestellt, dass mein Client die Verbindung nicht wiederherstellen würde, wenn ich den Server gezwungen hätte, die Verbindung zu beenden. (Ich hätte gerne ein WSSockets Fehler erhalten)

Also, für mich, das Update war:

con = new HubConnection(_url); 
con.Error += (exception) => Error(exception); 
con.Start(); 

dann in der Error-Methode, Versuch wieder zu verbinden, indem Sie den obigen Code wieder aufrufen.

Verwandte Themen