Frage

Wir sind mit WCF-Dienst

auf der Client-Seite planen wir die Verbindung explizit schließen Es scheint, gibt es mehr als eine Art und Weise zu schließen

Sample1: Im finally-Block der WCF-Dienst Verbrauch Verwendung

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

Da, wenn der Dienst in Fehlerzustand ist, werden wir nicht in der Lage sein, nahe zu nennen ()

Sample2:

using(ClientProxy proxy = new ClientProxy())
{   
  //call your service methods
}

in sample2 ich bin nicht sicher, was passieren wird, wenn der Dienst im Fehlerzustand befindet, wird es Fehler aus, die Verbindung geschlossen wird?

War es hilfreich?

Lösung

Die zweite Probe, die die „Verwendung“ Block verwendet, ist nicht korrekt. Die Verwendung von Block stellt sicher, dass das Entsorgen Methode auf dem Proxy-Objekt aufgerufen wird. Die Dispose-Methode ruft wiederum die Close-Methode, die mit dem Dienst zu verbinden (versuchen), die eine Ausnahme auslösen, wenn der Kommunikationszustand fehlerhaft ist. So Ihre Gefühle / Vorahnung sind absolut richtig. Es wäre schön, wenn die Proxy-Methode Entsorgen Sie den Code aus Ihrer ersten Probe verwendet, aber es ist nicht so verwenden Sie nicht die Verwendung von Block:)

Andere Tipps

Sie haben alle notwendigen Informationen zur Hand - die resultierende Best Practice zu verwenden und richtig schließen / abbrechen Ihre WCF-Client-Proxies würde:

YourClientProxy clientProxy = new YourClientProxy();

try
{
   .. use your service
   clientProxy.Close();
}
catch(FaultException)
{
   clientProxy.Abort();
}
catch(CommunicationException)
{
   clientProxy.Abort();
}
catch (TimeoutException)
{ 
   clientProxy.Abort();
}

die FaultException Fangen behandelt alle Fälle, wenn der Dienst mit einem Fehlerzustand responsded (und damit Ihr Kanal ist in einem fehlerhaften Zustand) und Communication alle andere kommunikationsbezogene Ausnahmen behandeln, die, wie die Netzwerkverbindung fällt etc. auftreten können

Der Ansatz mit der Verwendung von () Block wird nicht funktionieren, da, wenn eine Ausnahme am Ende des Blockes geschieht, wenn die Methode Dispose () die Close () Methode auf der Client-Proxy aufruft, haben Sie keine Möglichkeit haben, Fang und das Handling.

In Juval Lowy des Excellent Programming WCF Buch er empfiehlt:

try 
{
    ClientProxy clientProxy = new ClientProxy();
    clientProxy.SomeMethod();
    clientProxy.Close();
}
catch
{
    proxy.Abort();
}

Verwenden Probe 1

Hier ist ein guter Artikel darüber, warum Sie nicht verwenden sollten, mit:

http://msdn.microsoft.com/en-us/library /aa355056.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top