2009-03-01 2 views
8

Ich habe einen Windows-Dienst, der Geschwindigkeitsmesswerte von einer Radarpistole zu einer Datenbank protokolliert. Außerdem habe ich den Service zu einem WCF-Server gemacht. Ich habe einen Forms-Client und einen CF-Client, die den Dienst abonnieren und immer dann zurückgerufen werden, wenn ein Messwert vorliegt, der bestimmte Kriterien erfüllt.Langfristiger Rückrufvertrag über WCF-Duplexkanal - alternative Entwurfsmuster?

Dies funktioniert im Prinzip, aber nach einiger Zeit der Kanal abläuft. Es scheint, dass es einige grundlegende Probleme mit lang laufenden Verbindungen gibt (siehe http://blogs.msdn.com/drnick/archive/2007/11/05/custom-transport-retry-logic.aspx) und ein Duplex-HTTP-Rückruf ist möglicherweise nicht die richtige Lösung. Gibt es noch andere Möglichkeiten, ein Veröffentlichungs-/Abonnementmuster mit WCF zu realisieren?

Edit: Auch mit einer 2-Stunden-Timeout ist der Kanal schließlich gefährdet. Ich bekomme diesen Fehler:

Die Operation 'SignalSpeedData' konnte nicht abgeschlossen werden, da der sessionful Kanal abgelaufen ist, warten auf eine Nachricht empfangen. Um das Zeitlimit zu erhöhen, legen Sie in der Konfigurationsdatei die Eigenschaft receiveTimeout für die Bindung fest, oder legen Sie die Eigenschaft ReceiveTimeout für die Bindung direkt fest.

Dies geschah 15 Minuten nach dem letzten erfolgreichen Anruf. Ich frage mich, ob, anstatt die Sitzung offen zu halten, es möglich ist, für jeden Anruf eine neue Sitzung wiederherzustellen.

Antwort

6

Zuverlässige Nachrichtenübermittlung kümmert sich um Ihre Bedürfnisse. Der Kanal wird wiederhergestellt, wenn ein Problem auftritt. WSDualHTTPBinding stellt dies für die http-Bindung bereit, und es gibt auch eine tcp-Bindung, die dies ermöglicht. Wenn Sie sich auf demselben Computer befinden, wird die Named Pipe-Bindung dies standardmäßig bereitstellen.

+0

Wenn Sie zuverlässige Sitzung bedeuten - ich benutze das bereits und ich setze das Inaktivitäts-Timeout auf 2 Stunden. – cdonner

+1

Also, RS soll Infrastrukturnachrichten nach dem Inaktivitäts-Timeout senden. Leider ist es nicht in der neuesten Version des Frameworks. Wenn Sie alle 20 Minuten eine "Heartbeat" -Nachricht senden, sollte das Problem behoben sein. Es gibt noch eine andere Einstellung, die ich morgen nachschlagen muss. – Steve

+3

Lieber Steve, cdonner, Was war die tatsächliche Lösung? Die Heartbeat-Nachrichten sehen für mich nicht gut aus und ich würde einige Konfigurationsparameter bevorzugen. –