2010-03-14 12 views
8

Ich habe eine WPF-Anwendung, die WCF-Dienste verwendet, um Aufrufe an den Server vorzunehmen.WCF-Dienst-Client-Lebensdauer

Ich benutze diese Eigenschaft in meinem Code den Dienst

private static IProjectWcfService ProjectService 
{ 
    get 
    { 
     _projectServiceFactory = new ProjectWcfServiceFactory(); 
     return _projectServiceFactory.Create(); 
    } 
} 

Die auf der Fabrik erstellen wie diese

public IProjectWcfService Create() 
    { 
     _serviceClient = new ProjectWcfServiceClient(); 

     //ToDo: Need some way of saving username and password 
     _serviceClient.ClientCredentials.UserName.UserName = "MyUsername"; 
     _serviceClient.ClientCredentials.UserName.Password = "MyPassword"; 

     return _serviceClient; 
    } 

sieht Zugriff auf den Dienst Methoden, die ich wie die folgenden verwenden zugreifen somethingn.

ProjectService.Save(dto); 

Ist dies ein guter Ansatz für das, was ich versuche zu tun? Ich bekomme einen Fehler, den ich nicht aufspüren kann. Ich denke, dass möglicherweise zu viele Service-Client-Verbindungen geöffnet sind (ist das möglich?) Beachten Sie, dass ich den Service-Client nie schließe oder ihn wiederverwende.

Was wäre die beste Vorgehensweise für WCF-Service-Clients für WPF-Anrufe?

Vielen Dank im Voraus ...

Antwort

11

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

Grundsätzlich die WCF-Client-Proxy-Erstellung ist ein zweistufiger Prozess:

  • schaffen die Kanalfactory
  • aus dem Kanal-Fabrik, erstellen der eigentlichen Kanal

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

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

So ist die allgemein akzeptierte Best Practice wäre:

  • die ChannelFactory<T> (in Ihrem Fall: ProjectWcfServiceFactory) erstellen, sobald es wie möglich, so lange zwischenzuspeichern; Tun Sie das schwere Heben nur einmal

  • Erstellen Sie die tatsächlichen Channel (hier: IProjectWcfService) nach Bedarf, vor jedem Anruf. Auf diese Weise müssen Sie sich keine Sorgen um seinen Zustand überprüft und es je nach Bedarf

UPDATE neu zu erstellen: „? Was ist das Schließen des Kanals“ fragt Burt ;-) Guter Punkt !!

Die empfohlene bewährte Vorgehensweise besteht darin, Ihren Serviceanruf in einen try....catch....finally-Block zu verpacken. Der schwierige Teil ist: Wenn man den Kanal entsorgt, können auch Dinge schiefgehen, so dass man eine Ausnahme bekommen kann - deshalb ist es nicht ausreichend, sie in einen using(....) Block zu wickeln.

Also im Grunde haben Sie:

IProjectWcfService client = ChannelFactory.CreateChannel(); 
try 
{ 
    client.MakeYourCall(); 
} 
catch(CommunicationException ce) 
{ 
    // do any exception handling of your own 
} 
finally 
{ 
    ICommunicationObject comObj = ((ICommunicationObject)client); 

    if(comObj.State == CommunicationState.Faulted) 
    { 
     comObj.Abort(); 
    } 
    else 
    { 
     comObj.Close(); 
    } 
} 

Und natürlich könnte man auf jeden Fall das schön einpacken in ein Verfahren oder eine Erweiterungsmethode oder etwas, um diese nicht zu haben, jedes Mal wenn Sie einen Dienst machen tippen Anruf.

UPDATE:

Das Buch empfehle ich immer aufstehen und schnell in WCF läuft Learning WCF 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 hochwertige, nützliche WCF-Dienste zu schreiben.

Learning 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

den fortgeschritteneren Themen und mehr in eingehenden Blick auf WCF wird von Programming WCF Services von Juval Löwy abgedeckt werden. Er taucht in alle technischen Details und Themen ein und präsentiert "die Bibel" für die WCF-Programmierung.

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

+0

Wie wäre es, den Kanal zu schließen? – Burt

+0

Danke, das hat die Dinge ein bisschen aufgeräumt, ich muss wirklich ein WCF-Buch kaufen (irgendwelche Empfehlungen wären willkommen). – Burt

+0

Warum ist der Haken und letztlich im Wesentlichen die gleichen Dinge tun, d. H. ComObj.Abort? Muss der Fang abgebrochen werden? – Burt