Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 :
Créer une liaison.
Générez une fabrication de canal.
Créez un canal.
Envoyez une demande et lisez la réponse.
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