OperationContextScopeOperationContextScope

Im OperationContextScope-Beispiel veranschaulicht das Senden von zusätzlichen Informationen auf einen Header mit Windows Communication Foundation (WCF)-Aufruf.The OperationContextScope sample demonstrates how to send extra information on a Windows Communication Foundation (WCF) call using headers. In diesem Beispiel sind Server und Client Konsolenanwendungen.In this sample, both the server and client are console applications.

Hinweis

Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.The setup procedure and build instructions for this sample are located at the end of this topic.

Im Beispiel wird veranschaulicht, wie ein Client weitere Informationen als MessageHeader mit OperationContextScope senden kann.The sample demonstrates how a client can send additional information as a MessageHeader using OperationContextScope. Ein OperationContextScope-Objekt wird erstellt, indem es einem Kanal zugeordnet wird.An OperationContextScope object is created by scoping it to a channel. Der OutgoingMessageHeaders-Auflistung können Header hinzugefügt werden, die zum Remotedienst übersetzt werden müssen.Headers that must be translated to the remote service can be added to the OutgoingMessageHeaders collection. Dieser Auflistung hinzugefügte Header können im Dienst durch den Zugriff auf IncomingMessageHeaders abgerufen werden.Headers added to this collection can be retrieved on the service by accessing IncomingMessageHeaders. Die Aufrufe erfolgen auf mehreren Kanälen. Danach werden die dem Client hinzugefügten Header nur auf den Kanal angewendet, mit dem OperationContextScope erstellt wurde.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

Dies ist der Beispieldienst, der eine Nachricht vom Client empfängt und den Header in der IncomingMessageHeaders-Auflistung sucht.This is the sample service that receives a message from the client and tries to look up the header in the IncomingMessageHeaders collection. Der Client übergibt die im Header gesendete GUID, und der Dienst ruft den benutzerdefinierten Header ab und vergleicht ihn, falls vorhanden, mit der vom Client als Argument übergebenen GUID.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

Dies ist die Clientimplementierung, die der Proxy von generierten verwendet ServiceModel Metadata Utility Tool (Svcutil.exe) für die Kommunikation mit dem Remotedienst.This is the client implementation that uses the proxy generated by ServiceModel Metadata Utility Tool (Svcutil.exe) to communicate with the remote service. Zuerst werden zwei Proxyobjekte von MessageHeaderReaderClient erstellt.It first creates two proxy objects of MessageHeaderReaderClient.

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

Der Client erstellt dann OperationContextScope und bewertet ihn zu client1.Client then creates an OperationContextScope and scopes it to client1. MessageHeader wird ein OutgoingMessageHeaders hinzugefügt, und es wird ein Aufruf auf beiden Clients aufgerufen.It adds a MessageHeader to OutgoingMessageHeaders and invokes one call on both clients. Es wird sichergestellt, dass der Header gesendet wird, nur auf client1 und nicht unter client2 durch Überprüfen des Rückgabewerts aus den RetrieveHeader aufrufen.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));  
}  

Dieses Beispiel ist selbst gehostet.This sample is self-hosted. Es wird die folgende Beispielausgabe vom Ausgeben des Beispiels bereitgestellt: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.  

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run the sample

  1. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  3. Um das Beispiel in einer einzelnen oder computerübergreifenden Konfiguration ausführen möchten, folgen Sie den Anweisungen Ausführen der Windows Communication Foundation-Beispiele.To run the sample in a single- or cross-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.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. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

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

Siehe auchSee Also