Zunächst einmal: Wir haben eine funktionierende Lösung für das Problem, das ich beschreiben werde, aber es fühlt sich einfach nicht richtig an.WCF Best Practice für Client/Server mit Benachrichtigungen
Wir haben eine Anwendung mit einem Anwendungsserver und etwa 30 - 100 Clients. Die Skalierung des Servers ist kein Problem. Am wichtigsten sind die Benachrichtigungen vom Server an die Clients, aber natürlich gibt es auch Service-Methoden, die vom Client zum Server aufgerufen werden.
Jetzt erstellen wir einen Servicevertrag mit einem Rückrufkanal, registrieren den Client im Dienst (d. H. Der Dienst enthält eine Liste aktiver Rückrufkanäle) und senden Benachrichtigungen über diese Rückrufkanäle.
Probleme mussten wir navigieren waren um:
- Timeouts der Verbindung - der Dienst enthält nun einige Keep-Alive-Methode, die von den Kunden über jede Minute pinged wird
- umklemmen Client nach Server- oder Netzwerkausfall - das ist der Hauptpunkt, um den ich besorgt bin. Im Moment haben wir ein lang laufendes Client-Objekt (Service-Referenz, geerbt von
DuplexClientBase
), um den Service und das Callback-Objekt aufzurufen, um empfangene Benachrichtigungen zu verarbeiten. Unterclient.Faulted
versuchen wir, den Client und das Callback-Objekt durch einen neu erstellten Client zu ersetzen, bis der Server wieder erreichbar ist. Dieser Ansatz beinhaltet eine ziemlich seltsame Ausnahmebehandlung ...
Frage: Wäre es besser, einen WCF-Dienst auf jedem Client zu starten und den Endpunkt eines jeden Client auf dem Server registrieren? Gibt es eine bessere Lösung für die beiden beschriebenen Probleme?
Edit: Der Punkt ist: Fehle ich etwas? - Ich glaube, dass die beschriebene Architektur ziemlich üblich sein sollte und ich suche nach dem "Standard", dem besten Weg, dies zu tun. Gibt es nicht eine Probe für diese Art von Setup?