OperationContextScopeOperationContextScope

Nell'esempio OperationContextScope viene illustrato come inviare informazioni aggiuntive su una chiamata di Windows Communication Foundation (WCF) utilizzo delle intestazioni.The OperationContextScope sample demonstrates how to send extra information on a Windows Communication Foundation (WCF) call using headers. In questo esempio sia il server che il client sono applicazioni console.In this sample, both the server and client are console applications.

Nota

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.The setup procedure and build instructions for this sample are located at the end of this topic.

Nell'esempio viene illustrato in che modo un client può inviare informazioni aggiuntive come un MessageHeader utilizzando OperationContextScope.The sample demonstrates how a client can send additional information as a MessageHeader using OperationContextScope. Un oggetto OperationContextScope viene creato definendone l'ambito su un canale.An OperationContextScope object is created by scoping it to a channel. Le intestazioni che devono essere tradotte nel servizio remoto possono essere aggiunte alla raccolta OutgoingMessageHeaders.Headers that must be translated to the remote service can be added to the OutgoingMessageHeaders collection. Le intestazioni aggiunte alla raccolta possono essere recuperate nel servizio accedendo alla proprietà IncomingMessageHeaders.Headers added to this collection can be retrieved on the service by accessing IncomingMessageHeaders. Le chiamate a questa proprietà vengono effettuate sui più canali e quindi le intestazioni aggiunte al client possono essere applicate solo al canale utilizzato per creare OperationContextScope.Its calls are made on multiple channels and then the headers added to the client only apply to the channel that was used to create the OperationContextScope.

MessageHeaderReaderMessageHeaderReader

Si tratta del servizio di esempio che riceve un messaggio dal client e tenta di cercare l'intestazione nella raccolta IncomingMessageHeaders.This is the sample service that receives a message from the client and tries to look up the header in the IncomingMessageHeaders collection. Il client passa il GUID inviato nell'intestazione, quindi il servizio recupera l'intestazione personalizzata e, se presente, lo confronta con il GUID passato come argomento dal client.The client passes the GUID that it sent in the header and the service retrieves the custom header and, if present, compares it with the GUID passed as the argument by the 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));  
}  

MessageHeaderClientMessageHeaderClient

Si tratta dell'implementazione client che usa il proxy generato da strumento ServiceModel Metadata Utility Tool (Svcutil.exe) per comunicare con il servizio remoto.This is the client implementation that uses the proxy generated by ServiceModel Metadata Utility Tool (Svcutil.exe) to communicate with the remote service. Crea innanzitutto due oggetti proxy di MessageHeaderReaderClient.It first creates two proxy objects of MessageHeaderReaderClient.

//Create two clients to the remote service.  
MessageHeaderReaderClient client1 = new MessageHeaderReaderClient();  
MessageHeaderReaderClient client2 = new MessageHeaderReaderClient();  

Il client crea quindi un OperationContextScope e ne definisce l'ambito su client1.Client then creates an OperationContextScope and scopes it to client1. Aggiunge un MessageHeader a OutgoingMessageHeaders ed esegue una chiamata su entrambi i client.It adds a MessageHeader to OutgoingMessageHeaders and invokes one call on both clients. Assicura che l'intestazione venga inviata solo su client1 e non in client2 controllando il valore restituito dal RetrieveHeader chiamare.It ensures that the header is sent only on client1 and not on client2 by checking the return value from the RetrieveHeader call.

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 RetreieveHeader 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));  
}  

Questo esempio è indipendente.This sample is self-hosted. L'esecuzione dell'esempio fornisce l'output di esempio seguente:The following sample output from running the sample is provided:

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.  

Per impostare, compilare ed eseguire l'esempioTo set up, build, and run the sample

  1. Assicurarsi di avere eseguito la procedura di installazione singola per gli esempi di Windows Communication Foundation.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Per compilare l'edizione in C# o Visual Basic .NET della soluzione, seguire le istruzioni in Building the Windows Communication Foundation Samples.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  3. Per eseguire l'esempio in una configurazione singola o tra computer, seguire le istruzioni in esegue gli esempi di Windows Communication Foundation.To run the sample in a single- or cross-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples.

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your machine. Verificare la directory seguente (impostazione predefinita) prima di continuare.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se questa directory non esiste, andare al Windows Communication Foundation (WCF) e gli esempi di Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti i Windows Communication Foundation (WCF) e WFWF esempi.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Questo esempio si trova nella directory seguente.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Services\OperationContextScope

Vedere ancheSee Also