Question

Nous utilisons le service WCF

côté client, nous prévoyons de fermer explicitement la connexion Il semble qu’il existe plus d’une façon de fermer

Sample1: Dans le bloc final de l'utilisation du service WCF, utilisez

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

Etant donné que si le service est en panne, nous ne pourrons pas appeler close ()

Exemple 2:

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

dans sample2, je ne suis pas sûr de ce qui se passera si le service est en état de panne, va-t-il déclencher une erreur en fermant la connexion?

Était-ce utile?

La solution

Le deuxième échantillon utilisant le code "utilisant" le bloc est incorrect. Le bloc using garantit que la méthode Dispose est appelée sur l'objet proxy. La méthode Dispose appelle à son tour la méthode Close qui va (essayer de) se connecter au service qui lève une exception lorsque l'état de la communication est défaillant. Donc, vos sentiments / intuitions sont absolument corrects. Il serait bien que la méthode proxy Dispose utilise le code de votre premier échantillon, mais elle n’utilise pas le bloc using:)

Autres conseils

Vous avez toutes les informations nécessaires sous la main. La meilleure pratique qui en résulte, qui consiste à utiliser et à fermer / abandonner correctement tous les serveurs mandataires de la WCF, est la suivante:

YourClientProxy clientProxy = new YourClientProxy();

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

La capture de l'exception FaultException traite tous les cas où le service reçoit une condition d'erreur (et donc votre canal est en état d'erreur), et CommunicationException gérera toutes les autres exceptions liées à la communication pouvant survenir, telles que la perte de connectivité réseau, etc. <

L'approche avec le bloc using () ne fonctionnera pas, car si une exception se produit à la fin du bloc, lorsque la méthode Dispose () appelle la méthode Close () sur le proxy client, vous n'avez aucun moyen de attraper et gérer cela.

5% GRKoStGpPKbKjAe5vsG7CA & sa = X & oi = book_result & ct = result & resnum = 1 # v = onepage & q = & f = false "rel =" nofollow noreferrer "> Programmation du livre WCF il recommande:

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

Utilisez l'exemple 1

Voici un bon article sur les raisons pour lesquelles vous ne devriez pas utiliser:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top