2011-01-01 11 views
14

Wir verwenden in unserer WCF-Anwendung ein Pub-Sub-Modell, das dem Microsoft-Beispiel sehr ähnlich ist: Design Patterns: List-Based Publish-Subscribe.Handhabung von gelöschten Clients in einer WCF-Anwendung mit Duplexbindung

Während der Dienst eine Vorstellung von subscribe() und unsubscribe() bietet, was ist die beste Vorgehensweise, um die Bereinigung in der Situation zu behandeln, wenn ein Client stirbt oder die Kanalfehler? Derzeit, wenn ein Client abonniert hänge ich an Handler auf den aktuellen InstanceContext ‚s Closed und Faulted Ereignisse (die Service-Benutzer ein PerSession Instanz Kontextmodus und netTcpBinding):

_communicationObject = OperationContext.Current.InstanceContext; 
_communicationObject.Closed += OnClientLost; 
_communicationObject.Faulted += OnClientLost; 

Der OnClientLost Handler einfach Abo kündigt den Client, aber:

  1. Ist das obige eine gute Übung und alleine robust genug, um alle Situationen zu erfassen, in denen ein Client die Duplex-Kommunikation abbricht? Oder sollte der Dienst nur Ausnahmen behandeln, die an dem Punkt auftreten, an dem er versucht, mit dem Client zu kommunizieren und dann mit der Bereinigung zu beginnen?
  2. Abgesehen von der Abmeldung des Client-Call-Back-Handlers, sollte eine weitere Bereinigung speziell im Fehlerfall durchgeführt werden?

This question stellt eine ähnliche Frage, aber letztlich keine Antworten außerhalb des Kunden auf die Fälle vorsieht Aufruf abonnieren und/oder abmelden

Dank

Antwort

8

Ich habe einige Tests durchgeführt, bei denen ich Handler an die Closed- und Faulted-Ereignisse des Rückrufkanals anschloss und dann den Client an dem Punkt löschte, bevor der Callback vom Server aufgerufen wurde. Bei jedem Versuch wurde das Ereignis "Closed/Faulted" sofort ausgelöst und bevor der Server versuchte, den Rückruf aufzurufen. Trotzdem habe ich den Callback-Aufruf immer noch in einen try-catch-Block gehüllt, weil die Zerstörung des Client-Kanals genau dann stattfinden konnte, als ein anderer Thread den Callback eintrug.

Die einzige notwendige Bereinigung war, den Verweis auf den Rückrufkanal zu entfernen. WCF und der Müllsammler erledigen den Rest.

2

diese Ereignisse Handhabung wird Ihre Liste der Abonnenten synchronisiert halten. Es ist in der Tat robust genug. Denken Sie daran, dass wenn ein Client während der Übertragung einer Nachricht abstürzt, Sie möglicherweise eine Ausnahme erhalten, bevor diese Ereignisse ausgelöst werden. Seien Sie also bereit, sie zu ignorieren, damit die Ereignisse bereinigt werden können.

Mit Ausnahme des Entfernens des Clients aus der Abonnentenliste hängt die zusätzliche Bereinigung vollständig von Ihrer Anwendung ab (d. H. Ressourcen freigeben, die Sie beim Verbinden des Clients erhalten haben). Mir ist keine andere Bereinigung bekannt, die erforderlich ist.