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.
L’exemple OperationContextScope montre comment envoyer des informations supplémentaires sur un appel Windows Communication Foundation (WCF) à l’aide d’en-têtes. Dans cet exemple, le serveur et le client sont des applications console.
Remarque
La procédure d’installation et les instructions de génération de cet exemple se trouvent à la fin de cette rubrique.
L’exemple montre comment un client peut envoyer des informations supplémentaires en tant qu’utilisation MessageHeaderOperationContextScope. Un OperationContextScope objet est créé en l’appliquant à un canal. Les en-têtes qui doivent être traduits vers le service distant peuvent être ajoutés à la OutgoingMessageHeaders collection. Les en-têtes ajoutés à cette collection peuvent être récupérés sur le service en accédant IncomingMessageHeaders. Ses appels sont effectués sur plusieurs canaux, puis les en-têtes ajoutés au client s’appliquent uniquement au canal utilisé pour créer le OperationContextScope.
MessageHeaderReader
Il s’agit de l’exemple de service qui reçoit un message du client et tente de rechercher l’en-tête dans la IncomingMessageHeaders collection. Le client transmet le GUID qu’il a envoyé dans l’en-tête et le service récupère l’en-tête personnalisé et, le cas échéant, le compare au GUID passé en tant qu’argument par le client.
public bool RetrieveHeader(string guid)
{
MessageHeaders messageHeaderCollection =
OperationContext.Current.IncomingMessageHeaders;
String guidHeader = null;
Console.WriteLine("Trying to check if IncomingMessageHeader " +
" collection contains header with value {0}", guid);
if (messageHeaderCollection.FindHeader(
CustomHeader.HeaderName,
CustomHeader.HeaderNamespace) != -1)
{
guidHeader = messageHeaderCollection.GetHeader<String>(
CustomHeader.HeaderName, CustomHeader.HeaderNamespace);
}
else
{
Console.WriteLine("No header was found");
}
if (guidHeader != null)
{
Console.WriteLine("Found header with value {0}. "+
"Does it match with GUID sent as parameter: {1}",
guidHeader, guidHeader.Equals(guid));
}
Console.WriteLine();
//Return true if header is present and equals the guid sent by
// client as argument
return (guidHeader != null && guidHeader.Equals(guid));
}
MessageHeaderClient
Il s’agit de l’implémentation du client qui utilise le proxy généré par l’outil utilitaire de métadonnées ServiceModel (Svcutil.exe) pour communiquer avec le service distant. Il crée d’abord deux objets proxy de MessageHeaderReaderClient.
//Create two clients to the remote service.
MessageHeaderReaderClient client1 = new MessageHeaderReaderClient();
MessageHeaderReaderClient client2 = new MessageHeaderReaderClient();
Le client crée ensuite un OperationContextScope et l’étend à client1. Il ajoute un MessageHeader appel à OutgoingMessageHeaders et appelle un appel sur les deux clients. Il garantit que l’en-tête est envoyé uniquement sur client1 et non en client2 vérifiant la valeur de retour de l’appel RetrieveHeader .
using (new OperationContextScope(client1.InnerChannel))
{
//Create a new GUID that is sent as the header.
String guid = Guid.NewGuid().ToString();
//Create a MessageHeader for the GUID we just created.
MessageHeader customHeader = MessageHeader.CreateHeader(CustomHeader.HeaderName, CustomHeader.HeaderNamespace, guid);
//Add the header to the OutgoingMessageHeader collection.
OperationContext.Current.OutgoingMessageHeaders.Add(customHeader);
//Now call RetrieveHeader on both the proxies. Since the OperationContextScope is tied to
//client1's InnerChannel, the header should only be added to calls made on that client.
//Calls made on client2 should not be sending the header across even though the call
//is made in the same OperationContextScope.
Console.WriteLine("Using client1 to send message");
Console.WriteLine("Did server retrieve the header? : Actual: {0}, Expected: True", client1.RetrieveHeader(guid));
Console.WriteLine();
Console.WriteLine("Using client2 to send message");
Console.WriteLine("Did server retrieve the header? : Actual: {0}, Expected: False", client2.RetrieveHeader(guid));
}
Cet exemple est auto-hébergé. L’exemple de sortie suivant de l’exécution de l’exemple est fourni :
Prompt> Service.exe
The service is ready.
Press <ENTER> to terminate service.
Trying to check if IncomingMessageHeader collection contains header with value 2239da67-546f-42d4-89dc-8eb3c06215d8
Found header with value 2239da67-546f-42d4-89dc-8eb3c06215d8. Does it match with GUID sent as parameter: True
Trying to check if IncomingMessageHeader collection contains header with value 2239da67-546f-42d4-89dc-8eb3c06215d8
No header was found
Prompt>Client.exe
Using client1 to send message
Did server retrieve the header? : Actual: True, Expected: True
Using client2 to send message
Did server retrieve the header? : Actual: False, Expected: False
Press <ENTER> to terminate client.
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’exemple dans une configuration à un ou plusieurs ordinateurs, conformez-vous aux instructions figurant dans la rubrique Exécution des exemples Windows Communication Foundation.