2011-01-02 7 views
8

Ich lerne gerade die Seile um WCF. Was ich vorhatte, war ein offener Duplexkanal zwischen einem Client und einem Server, der NetTcpBinding verwendet, und das auf unbegrenzte Zeit offen zu halten, damit der Server Anforderungen an den Client einleiten kann.WCF - ist es eine schlechte Übung, einen Kanal für eine lange Zeit offen zu lassen?

Dann stolperte ich über diese blog by Jesse Ezell, die darauf hinweist, dass es eine schlechte Sache ist, einen Kanal auf unbestimmte Zeit offen zu halten, weil Sie keine Fehler finden können, und das verursacht alle Arten von Instabilitäten.

Ist das korrekt? Wenn ich NetTcpBinding verwende und einen Verweis auf einen offenen Kanal auf beiden Seiten der Beziehung behalte, was passiert dann, wenn ein Kommunikationsfehler auftritt? Wie erfasse ich das Fehlerereignis? Welche anderen Probleme gibt es? Gibt es einen Unterschied, welches .NET Framework du verwendest? (Ich bin auf 4.0.)

Antwort

13

ich mit Jesse nicht einverstanden sind (als Randnotiz: Er empfiehlt Sie WCF-Service-Klassen als Singletons standardmäßig verwendet werden, die auch immer meiner Meinung nach die schlechteste Idee ist) .....

Solange Sie sich darum kümmern, Ausnahmen auf dem Server zu erfassen (z. B. durch Implementierung der IErrorHandler-Schnittstelle in Ihrer Serviceklasse), ist es hier nicht sinnvoll, Ihren Kanal herunterzufahren ... insbesondere nicht in einer Unternehmens-LAN-Umgebung mit netTcpBinding.

Im Gegensatz zu z.B. Eine Datenbankverbindung, die häufig Lizenzkosten verursacht, sollte keine Probleme verursachen, wenn eine Netzwerkverbindung zu Ihrem Service-Computer offen bleibt. Es ist auch in der Regel keine begrenzte Ressource, so dass das ständige Öffnen und Schließen sinnlos erscheint.

Wenn Sie Ihren Servicekanal länger geöffnet lassen, müssen Sie auf der Clientseite in der Lage sein, Fehler zu beheben - z. Sie müssen in der Lage sein, aus einer Situation, in der der Kanal fehlerhaft geworden ist, wiederherzustellen, wenn überhaupt eine Ausnahme aufgetreten ist (z. B. das Netzwerk ist ausgefallen oder so ähnlich).

Aber wenn Sie das tun, sehe ich keinen Vorteil in der ständigen Schließung Ihres Kanals nach jedem Anruf, und wieder für die nächste ...

öffnen
6

Ja ist es gute Praxis, den Kanal zu schließen, sobald es nicht mehr benötigt wird. Aber es ist nicht üblich bei Duplex-Kommunikation. Wenn Sie die Duplex-Kommunikation verwenden, benötigen Sie einen geöffneten Kanal, damit der Server Nachrichten an den Client zurücksenden kann. WCF-Kommunikation wird immer vom Client initiiert. Der Rückruf ist nur zulässig, wenn der vom Client initiierte Kanal beibehalten wird.

Bei der Duplexkommunikation sind einige zusätzliche Aufgaben erforderlich, um Verbindungsfehler zu beheben. Ihr Dienst sollte einen Ping-Mechanismus enthalten, damit der Client die Verbindung in regelmäßigen Abständen überprüfen kann. Wenn die Verbindung fehlschlägt, erhält der Client eine Ausnahme, und Sie können die Verbindung erneut herstellen. Der Dienst sollte auch eine Ausnahme behandeln, wenn eine Rückrufnachricht an einen fehlerhaften Kanal gesendet wird.

Verwandte Themen