Partager via


Programmation au niveau du canal client

Cette rubrique explique comment écrire une application cliente Windows Communication Foundation (WCF) sans utiliser la System.ServiceModel.ClientBase<TChannel> classe et son modèle objet associé.

Envoi de messages

Pour être prêt à envoyer des messages et à recevoir et traiter des réponses, les étapes suivantes sont requises :

  1. Créer une liaison.

  2. Générez une fabrication de canal.

  3. Créez un canal.

  4. Envoyez une demande et lisez la réponse.

  5. Fermer tous les objets de canal.

Création d’une liaison

Comme pour le cas de réception (voir Service Channel-Level Programmation), l’envoi de messages commence par créer une liaison. Cet exemple crée un nouveau System.ServiceModel.Channels.CustomBinding et ajoute une System.ServiceModel.Channels.HttpTransportBindingElement à sa collection Elements.

Création d’un ChannelFactory

Au lieu de créer un System.ServiceModel.Channels.IChannelListener, nous créons cette fois-ci un System.ServiceModel.ChannelFactory<TChannel> en appelant ChannelFactory.CreateFactory sur la liaison où le paramètre de type est System.ServiceModel.Channels.IRequestChannel. Les écouteurs de canal sont utilisés par le côté qui attend les messages entrants et les fabrications de canaux le sont par le côté qui initialise la communication pour créer un canal. Tout comme les écouteurs de chaîne, les usines de chaînes doivent être ouvertes avant de pouvoir être utilisées.

Création d’un canal

Ensuite, nous appelons ChannelFactory<TChannel>.CreateChannel pour créer un IRequestChannel. Cet appel prend l’adresse du point de terminaison avec lequel nous voulons communiquer à l’aide du nouveau canal créé. Après avoir capté un canal, nous appelons Open sur celui-ci afin qu'il soit prêt pour la communication. En fonction de la nature du transport, cet appel à Open peut lancer une connexion avec le point de terminaison cible ou ne rien faire du tout sur le réseau.

Envoi d’une demande et lecture de la réponse

Une fois que nous avons un canal ouvert, nous pouvons créer un message et utiliser la méthode Request du canal pour envoyer la demande et attendre que la réponse revienne. Lorsque cette méthode est retournée, nous avons un message de réponse que nous pouvons lire pour connaître la réponse du point de terminaison.

Fermeture des objets

Pour éviter la fuite de ressources, nous fermons les objets utilisés dans les communications lorsqu’ils ne sont plus nécessaires.

L’exemple de code suivant montre un client simple utilisant la fabrique de canaux pour envoyer un message et lire la réponse.

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
namespace ProgrammingChannels
{
class Client
{

    static void RunClient()
    {
        //Step1: Create a binding with just HTTP.
        BindingElement[] bindingElements = new BindingElement[2];
        bindingElements[0] = new TextMessageEncodingBindingElement();
        bindingElements[1] = new HttpTransportBindingElement();
        CustomBinding binding = new CustomBinding(bindingElements);

        //Step2: Use the binding to build the channel factory.
        IChannelFactory<IRequestChannel> factory =
        binding.BuildChannelFactory<IRequestChannel>(
                         new BindingParameterCollection());
        //Open the channel factory.
        factory.Open();

        //Step3: Use the channel factory to create a channel.
        IRequestChannel channel = factory.CreateChannel(
           new EndpointAddress("http://localhost:8080/channelapp"));
        channel.Open();

        //Step4: Create a message.
        Message requestmessage = Message.CreateMessage(
            binding.MessageVersion,
            "http://contoso.com/someaction",
             "This is the body data");
        //Send message.
        Message replymessage = channel.Request(requestmessage);
        Console.WriteLine("Reply message received");
        Console.WriteLine($"Reply action: {replymessage.Headers.Action}");
        string data = replymessage.GetBody<string>();
        Console.WriteLine($"Reply content: {data}");

        //Step5: Do not forget to close the message.
        replymessage.Close();
        //Do not forget to close the channel.
        channel.Close();
        //Do not forget to close the factory.
        factory.Close();
    }
    public static void Main()
    {
        Console.WriteLine("Press [ENTER] when service is ready");
        Console.ReadLine();
        RunClient();
        Console.WriteLine("Press [ENTER] to exit");
        Console.ReadLine();
    }
}
}

Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.ServiceModel.Configuration

Namespace ProgrammingChannels
    Friend Class Client

        Private Shared Sub RunClient()
            'Step1: Create a binding with just HTTP.
            Dim bindingElements(1) As BindingElement = {New TextMessageEncodingBindingElement(), _
                                                        New HttpTransportBindingElement()}
            Dim binding As New CustomBinding(bindingElements)

            'Step2: Use the binding to build the channel factory.
            Dim factory = binding.BuildChannelFactory(Of IRequestChannel)(New BindingParameterCollection())
            'Open the channel factory.
            factory.Open()

            'Step3: Use the channel factory to create a channel.
            Dim channel = factory.CreateChannel(New EndpointAddress("http://localhost:8080/channelapp"))
            channel.Open()

            'Step4: Create a message.
            Dim requestmessage = Message.CreateMessage(binding.MessageVersion, _
                                                       "http://contoso.com/someaction", _
                                                       "This is the body data")
            'Send message.
            Dim replymessage = channel.Request(requestmessage)
            Console.WriteLine("Reply message received")
            Console.WriteLine("Reply action: {0}", replymessage.Headers.Action)
            Dim data = replymessage.GetBody(Of String)()
            Console.WriteLine("Reply content: {0}", data)

            'Step5: Do not forget to close the message.
            replymessage.Close()
            'Do not forget to close the channel.
            channel.Close()
            'Do not forget to close the factory.
            factory.Close()
        End Sub

        Public Shared Sub Main()

            Console.WriteLine("Press [ENTER] when service is ready")
            Console.ReadLine()
            RunClient()
            Console.WriteLine("Press [ENTER] to exit")
            Console.ReadLine()

        End Sub
    End Class
End Namespace