Lebensdauer des WCF-Dienstclients

8

Ich habe eine WPF-Anwendung, die WCF-Dienste verwendet, um Aufrufe an den Server zu tätigen.

Ich verwende diese Eigenschaft in meinem Code, um auf den Service zuzugreifen

%Vor%

Das Erstellen in der Fabrik sieht so aus

%Vor%

Um auf die Service-Methoden zuzugreifen, verwende ich sowas wie das folgende.

%Vor%

Ist das ein guter Ansatz für das, was ich versuche? Ich bekomme eine Fehlermeldung, dass ich nicht finden kann, dass ich denke, möglicherweise zu viele Service-Client-Verbindungen geöffnet haben (ist das möglich?) Beachten Sie, dass ich nie den Service-Client schließen oder es wiederverwenden.

Was wäre die beste Vorgehensweise für WCF-Dienstclients beim WPF-Aufruf?

Vielen Dank im Voraus ...

    
Burt 14.03.2010, 00:00
quelle

1 Antwort

11

Sie sind auf dem richtigen Weg, würde ich sagen; -)

Grundsätzlich ist das Erstellen des WCF-Client-Proxys ein zweistufiger Prozess:

  • Erstellen Sie die Kanalfactory
  • Erstellen Sie in der Kanalfactory den tatsächlichen Kanal

Schritt # 1 ist ziemlich "teuer" in Bezug auf Zeit und Aufwand - also ist es definitiv eine gute Idee, das einmal zu machen und dann die Instanz von ProjectWcfServiceFactory irgendwo im Code zwischenzuspeichern.

Schritt # 2 ist eigentlich ziemlich leicht, und da ein Kanal zwischen einem Client und einem Dienst in einen "fehlerhaften Zustand" geraten kann, wenn eine Ausnahme auf dem Server passiert (und dann von Grund auf neu erstellt werden muss), Zwischenspeichern der tatsächliche Kanal an sich ist weniger wünschenswert.

Also wäre die allgemein akzeptierte Best Practice:

  • Erstelle die ChannelFactory<T> (in deinem Fall: ProjectWcfServiceFactory ) einmal und cache sie so lange wie möglich; Mach das schwere Heben nur einmal

  • Erstellen Sie vor jedem Aufruf die aktuelle Channel (hier: IProjectWcfService ) nach Bedarf. Auf diese Weise müssen Sie sich nicht darum kümmern, seinen Status zu überprüfen und ihn bei Bedarf neu zu erstellen.

UPDATE: "Was ist mit dem Schließen des Kanals?" fragt Burt ;-) Guter Punkt !!

Die empfohlene Best Practice dafür besteht darin, Ihren Serviceaufruf in einen try....catch....finally -Block zu verpacken. Der heikle Teil ist: wenn man den Kanal entsorgt, können auch Dinge falsch laufen, so dass man eine Ausnahme bekommen kann - deshalb ist es nicht ausreichend, sie in einen using(....) Block zu wickeln.

Also im Grunde hast du:

%Vor%

Und natürlich können Sie dies ganz einfach in eine Methode oder eine Erweiterungsmethode einbetten, damit Sie nicht jedes Mal, wenn Sie einen Serviceanruf tätigen, dies eingeben müssen.

UPDATE:

Das Buch, das ich immer empfehle, schnell in WCF aufzustehen, ist WCF lernen von Michele Leroux Bustamante. Sie deckt alle notwendigen Themen ab und ist verständlich und zugänglich. Dadurch lernen Sie alles - Grundlagen, Zwischenthemen, Sicherheit, Transaktionskontrolle usw. -, die Sie benötigen, um qualitativ hochwertige, nützliche WCF-Dienste zu schreiben.

Lernen WCF http://ecx.images-amazon.com/images/I/41wYa%2BNiPML._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

Die fortgeschritteneren Themen und ein eingehenderer Blick auf WCF werden von Programming WCF Services von Juval abgedeckt Lowy. Er taucht in alle technischen Details und Themen ein und präsentiert "die Bibel" für die WCF-Programmierung.

Programmieren von WCF-Diensten http://ecx.images-amazon.com/images/I/41H2u13a9bL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

    
marc_s 14.03.2010, 08:23
quelle

Tags und Links