Delen via


OperationContextScope

Het OperationContextScope-voorbeeld laat zien hoe u extra informatie over een WCF-aanroep (Windows Communication Foundation) verzendt met behulp van headers. In dit voorbeeld zijn zowel de server als de client consoletoepassingen.

Notitie

De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.

Het voorbeeld laat zien hoe een client aanvullende informatie kan verzenden als een MessageHeader gebruik OperationContextScope. Een OperationContextScope object wordt gemaakt door het bereik naar een kanaal te beperken. Headers die moeten worden vertaald naar de externe service, kunnen worden toegevoegd aan de OutgoingMessageHeaders verzameling. Headers die aan deze verzameling worden toegevoegd, kunnen worden opgehaald in de service door toegang te krijgen IncomingMessageHeaderstot . De aanroepen worden uitgevoerd op meerdere kanalen en vervolgens zijn de headers die aan de client zijn toegevoegd, alleen van toepassing op het kanaal dat is gebruikt om het OperationContextScopete maken.

MessageHeaderReader

Dit is de voorbeeldservice die een bericht van de client ontvangt en probeert de header in de IncomingMessageHeaders verzameling op te zoeken. De client geeft de GUID door die wordt verzonden in de header en de service haalt de aangepaste header op en vergelijkt deze, indien aanwezig, met de GUID die is doorgegeven als het argument door de 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

Dit is de client-implementatie die gebruikmaakt van de proxy die wordt gegenereerd door het hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) om te communiceren met de externe service. Eerst worden twee proxyobjecten van MessageHeaderReaderClient.

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

Client maakt vervolgens een OperationContextScope en scopet deze tot client1. Er wordt een MessageHeader aan OutgoingMessageHeaders - en aanroept één aanroep op beide clients. Het zorgt ervoor dat de header alleen client1 wordt verzonden en niet wordt ingeschakeld client2 door de retourwaarde van de RetrieveHeader aanroep te controleren.

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

Dit voorbeeld wordt zelf gehost. De volgende voorbeelduitvoer van het uitvoeren van het voorbeeld is opgegeven:

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.

Het voorbeeld instellen, compileren en uitvoeren

  1. Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.

  2. Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.

  3. Als u het voorbeeld wilt uitvoeren in een configuratie met één of meerdere computers, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.