Accès aux services à l'aide d'un client WCF

Après la création d’un service, l’étape suivante consiste à créer un proxy client WCF. Une application cliente utilise le proxy client WCF pour communiquer avec le service. En général, les applications clientes importent les métadonnées d’un service pour générer le code client WCF qui permet d’appeler le service.

Les principales étapes pour créer un client WCF sont les suivantes :

  1. Compiler le code de service.

  2. Générer le proxy client WCF.

  3. Instanciez le proxy client WCF.

Le proxy client WCF peut être généré manuellement à l’aide de l’outil Service Model Metadata Utility Tool (SvcUtil.exe). Pour plus d’informations, consultez ServiceModel Metadata Utility Tool (Svcutil.exe). Le proxy client WCF peut également être généré dans Visual Studio à l’aide de la fonctionnalité Ajouter une référence de service. Pour générer le proxy client WCF à l'aide de l'une de ces méthodes, le service doit s'exécuter. Si le service est auto-hébergé, vous devez exécuter l'hôte. Si le service est hébergé dans IIS/WAS, aucune action n'est nécessaire.

Outil Service Model Metadata Tool

ServiceModel Metadata Utility Tool (Svcutil.exe) est un outil en ligne de commande pour générer du code à partir de métadonnées. Voici un exemple d'utilisation d'une commande Svcutil.exe de base.

Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>

Vous pouvez également utiliser Svcutil.exe avec des fichiers WSDL (Web Services Description Language) et XSD (XML Schema Definition) sur le système de fichiers.

Svcutil.exe <list of WSDL and XSD files on file system>

Le résultat est un fichier de code qui contient le code client WCF que l’application cliente peut utiliser pour appeler le service.

L'outil permet également de générer des fichiers de configuration.

Svcutil.exe <file1 [,file2]>

Si un seul nom de fichier est fourni, il s'agit du nom du fichier de sortie. Si deux noms de fichiers sont fournis, le premier est un fichier de configuration d’entrée dont le contenu est fusionné avec la configuration générée et écrit dans le deuxième fichier. Pour plus d’informations sur la configuration, consultez Configuration de liaisons pour les services.

Important

Les demandes de métadonnées non sécurisées représentent certains risques comme toute demande réseau non sécurisée. Si vous n'êtes pas certain de l'identité du point de terminaison avec lequel vous communiquez, il est possible que les informations que vous récupérez soient des métadonnées provenant d'un service malveillant.

Ajouter une référence de service dans Visual Studio

Lorsque le service est en cours d’exécution, cliquez avec le bouton droit sur le projet qui contient le proxy client WCF et sélectionnez Ajouter>Référence de service. Dans la boîte de dialogue Ajouter une référence de service, tapez l’URL du service que vous souhaitez appeler et cliquez sur le bouton Aller à. La boîte de dialogue affiche une liste de services disponibles à l'adresse que vous spécifiez. Double-cliquez sur le service pour afficher les contrats et les opérations disponibles, spécifiez un espace de noms pour le code généré et cliquez sur le bouton OK.

Exemple

L'exemple de code suivant montre un contrat de service créé pour un service.

// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    // Other methods are not shown here.
}
' Define a service contract.
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
    <OperationContract()>  _
    Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
    ' Other methods are not shown here.
End Interface

ServiceModel Metadata Utility Tool et Ajouter une référence de service dans Visual Studio génèrent la classe cliente WCF suivante. La classe hérite de la classe générique ClientBase<TChannel> et implémente l'interface ICalculator. L'outil génère également l'interface ICalculator (qui n'est pas présentée ici).

public partial class CalculatorClient : System.ServiceModel.ClientBase<ICalculator>, ICalculator
{
    public CalculatorClient()
    {}

    public CalculatorClient(string endpointConfigurationName) :
            base(endpointConfigurationName)
    {}

    public CalculatorClient(string endpointConfigurationName, string remoteAddress) :
            base(endpointConfigurationName, remoteAddress)
    {}

    public CalculatorClient(string endpointConfigurationName,
        System.ServiceModel.EndpointAddress remoteAddress) :
            base(endpointConfigurationName, remoteAddress)
    {}

    public CalculatorClient(System.ServiceModel.Channels.Binding binding,
        System.ServiceModel.EndpointAddress remoteAddress) :
            base(binding, remoteAddress)
    {}

    public double Add(double n1, double n2)
    {
        return base.Channel.Add(n1, n2);
    }
}
Partial Public Class CalculatorClient
    Inherits System.ServiceModel.ClientBase(Of ICalculator)
    Implements ICalculator

    Public Sub New()
        MyBase.New
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String)
        MyBase.New(endpointConfigurationName)
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As String)
        MyBase.New(endpointConfigurationName, remoteAddress)
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String,
        ByVal remoteAddress As System.ServiceModel.EndpointAddress)
        MyBase.New(endpointConfigurationName, remoteAddress)
    End Sub

    Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding,
        ByVal remoteAddress As System.ServiceModel.EndpointAddress)
        MyBase.New(binding, remoteAddress)
    End Sub

    Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
        Implements ICalculator.Add
        Return MyBase.Channel.Add(n1, n2)
    End Function
End Class

Utilisation du client WCF

Pour utiliser le client WCF, créez une instance du client WCF, puis appelez ses méthodes, tel qu’indiqué dans le code suivant.

// Create a client object with the given client endpoint configuration.
CalculatorClient calcClient = new CalculatorClient("CalculatorEndpoint");
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = calcClient.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
' Create a client object with the given client endpoint configuration.
Dim calcClient As CalculatorClient = _
New CalculatorClient("CalculatorEndpoint")

' Call the Add service operation.
Dim value1 As Double = 100.00D
Dim value2 As Double = 15.99D
Dim result As Double = calcClient.Add(value1, value2)
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result)

Débogage d'exceptions levées par un Client

De nombreuses exceptions levées par un client WCF sont provoquées par une exception sur le service. Quelques exemples :

  • SocketException : une connexion existante a été arrêtée de force par l'hôte distant.

  • CommunicationException : la connexion sous-jacente s'est arrêtée de façon inattendue.

  • CommunicationObjectAbortedException : la connexion de socket a été abandonnée. Cela peut être dû à une erreur lors du traitement de votre message, l'expiration du délai de réception par l'hôte distant ou un problème de ressource sur le réseau sous-jacent.

Lorsque ces types d'exceptions se produisent, le meilleur moyen de les résoudre consiste à activer le suivi du côté service et de déterminer l'exception qui s'y est produite. Pour plus d’informations sur le traçage, consultez Traçage et Utilisation du suivi pour résoudre les problèmes posés par votre application.

Voir aussi