Untyped Request/Reply
L’exemple Untyped montre comment définir des contrats d'opération qui utilisent la classe Message.
Notes
La procédure d'installation ainsi que les instructions de génération relatives à cet exemple figurent à la fin de cette rubrique.
Cet exemple est basé sur l’exemple Getting Started. Le contrat de service définit une opération qui prend un type de message comme argument et retourne un message. L'opération recueille toutes les données requises pour calculer la somme du corps du message puis envoie la somme dans le corps du message de retour.
[OperationContract(Action = CalculatorService.RequestAction, ReplyAction = CalculatorService.ReplyAction)]
Message ComputeSum(Message request);
Sur le service, l'opération récupère le tableau d'entiers passé dans le message d'entrée puis calcule la somme. Pour envoyer un message de réponse, l'exemple crée un nouveau message avec la version de message et l'action appropriées et inclut la somme calculée dans son corps. C'est ce que montre l'exemple de code suivant.
public Message ComputeSum(Message request)
{
//The body of the message contains a list of numbers which will be
//read as a int[] using GetBody<T>
int result = 0;
int[] inputs = request.GetBody<int[]>();
foreach (int i in inputs)
{
result += i;
}
Message response = Message.CreateMessage(request.Version,
ReplyAction, result);
return response;
}
Le client utilise du code généré par l’outil ServiceModel Metadata Utility (Svcutil.exe) pour créer un proxy vers le service distant. Pour envoyer un message de demande, le client doit connaître la version du message, qui dépend du canal sous-jacent. Donc, il crée une OperationContextScope étendue au canal proxy qu'il a créé, ce qui crée un OperationContext avec la version de message correcte indiquée à la propriété OutgoingMessageHeaders.MessageVersion
. Le client passe un tableau d'entrées dans le corps du message de demande puis appelle ComputeSum
sur le proxy. Le client récupère ensuite la somme des entrées qu'il a passées en accédant à la méthode GetBody<T>
depuis le message de réponse. C'est ce que montre l'exemple de code suivant.
using (new OperationContextScope(client.InnerChannel))
{
// Call the Sum service operation.
int[] values = { 1, 2, 3, 4, 5 };
Message request = Message.CreateMessage(
OperationContext.Current.OutgoingMessageHeaders.MessageVersion,
RequestAction, values);
Message reply = client.ComputeSum(request);
int response = reply.GetBody<int>();
Console.WriteLine("Sum of numbers passed (1,2,3,4,5) = {0}",
response);
}
Cet exemple est un exemple hébergé sur le Web donc seul le fichier exécutable client doit être exécuté. L'exemple suivant illustre la sortie sur le client.
Prompt>Client.exe
Sum of numbers passed (1,2,3,4,5) = 15
Press <ENTER> to terminate client.
Cet exemple est un exemple hébergé sur le Web : suivez le lien fourni à l'étape 3 pour voir comment générer et exécuter l'exemple.
Pour configurer, générer et exécuter l'exemple
Assurez-vous d’avoir effectué la Procédure d’installation unique pour les exemples Windows Communication Foundation.
Pour générer l’édition C# ou Visual Basic .NET de la solution, conformez-vous aux instructions figurant dans Building the Windows Communication Foundation Samples.
Pour exécuter l’échantillon dans une configuration à un ou plusieurs ordinateurs, conformez-vous aux instructions fournies dans Exécution des échantillons Windows Communication Foundation.