2010-08-17 7 views
3

Je veux savoir comment appeler en toute sécurité une méthode de service Web WCF. Ces deux méthodes sont-elles acceptables/équivalentes? Y a-t-il un meilleur moyen?Comment appeler une méthode de service Web dans C#

1er chemin:

public Thing GetThing() 
{ 
    using (var client = new WebServicesClient()) 
    { 
     var thing = client.GetThing(); 
     return thing; 
    } 
} 

2ème façon:

public Thing GetThing() 
{ 
    WebServicesClient client = null; 
    try 
    { 
     client = new WebServicesClient(); 
     var thing = client.GetThing(); 
     return thing; 
    } 
    finally 
    { 
     if (client != null) 
     { 
      client.Close(); 
     } 
    } 
} 

Je veux vous assurer que le client est bien fermé et éliminés.

Merci

Répondre

4

L'utilisation using (sans jeu de mots) est not recommended parce que même Dispose() peut lancer des exceptions.

est ici quelques méthodes d'extension que nous utilisons:

using System; 
using System.ServiceModel; 

public static class CommunicationObjectExtensions 
{ 
    public static void SafeClose(this ICommunicationObject communicationObject) 
    { 
     if(communicationObject.State != CommunicationState.Opened) 
      return; 

     try 
     { 
      communicationObject.Close(); 
     } 
     catch(CommunicationException ex) 
     { 
      communicationObject.Abort(); 
     } 
     catch(TimeoutException ex) 
     { 
      communicationObject.Abort(); 
     } 
     catch(Exception ex) 
     { 
      communicationObject.Abort(); 
      throw; 
     } 
    } 

    public static TResult SafeExecute<TServiceClient, TResult>(this TServiceClient communicationObject, 
     Func<TServiceClient, TResult> serviceAction) 
     where TServiceClient : ICommunicationObject 
    { 
     try 
     { 
      var result = serviceAction.Invoke(communicationObject); 
      return result; 
     } // try 

     finally 
     { 
      communicationObject.SafeClose(); 
     } // finally 
    } 
} 

Avec ces deux:

var client = new WebServicesClient(); 
return client.SafeExecute(c => c.GetThing()); 
+0

Je crée toujours une instance de WebServicesClient et je l'utilise dans toute l'instance de l'application, est-ce que cela cause un problème? –

+0

Merci pour ça. Je ne m'attendais pas à être si compliqué, mais ça a l'air bien. – zod

1

La seconde façon est légèrement meilleure car vous faites face au fait qu'une exception peut être levée. Si vous avez piégé et au moins connecté l'exception spécifique ce serait mieux.

Cependant, ce code va bloquer jusqu'à ce que GetThing renvoie. S'il s'agit d'une opération rapide, cela peut ne pas poser de problème, mais sinon, une meilleure approche consiste à créer une méthode asynchrone pour obtenir les données. Cela déclenche un événement pour indiquer l'achèvement et vous vous abonnez à cet événement pour mettre à jour l'interface utilisateur (ou quoi que ce soit que vous devez faire).

Questions connexes