Läs på engelska

Dela via


OperationContextScope

Exemplet OperationContextScope visar hur du skickar extra information i ett WCF-anrop (Windows Communication Foundation) med hjälp av rubriker. I det här exemplet är både servern och klienten konsolprogram.

Anteckning

Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.

Exemplet visar hur en klient kan skicka ytterligare information som en MessageHeader med hjälp av OperationContextScope. Ett OperationContextScope objekt skapas genom att omfångsbilda det till en kanal. Rubriker som måste översättas till fjärrtjänsten kan läggas till i OutgoingMessageHeaders samlingen. Rubriker som har lagts till i den här samlingen kan hämtas i tjänsten genom åtkomst IncomingMessageHeaderstill . Dess anrop görs i flera kanaler och sedan gäller rubrikerna som läggs till i klienten endast för den kanal som användes för att skapa OperationContextScope.

MessageHeaderReader

Det här är exempeltjänsten som tar emot ett meddelande från klienten och försöker leta upp huvudet i IncomingMessageHeaders samlingen. Klienten skickar det GUID som skickades i huvudet och tjänsten hämtar det anpassade huvudet och jämför det om det finns med GUID som skickas som argument av klienten.

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

Det här är klientimplementeringen som använder proxyn som genereras av ServiceModel Metadata Utility Tool (Svcutil.exe) för att kommunicera med fjärrtjänsten. Den skapar först två proxyobjekt för MessageHeaderReaderClient.

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

Klienten skapar sedan ett OperationContextScope och omfångsbegränsar det till client1. Den lägger till ett MessageHeader till OutgoingMessageHeaders och anropar ett anrop på båda klienterna. Det säkerställer att huvudet endast skickas på client1 och inte på client2 genom att kontrollera returvärdet från anropet 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));
}

Det här exemplet är lokalt. Följande exempelutdata från att köra exemplet tillhandahålls:

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.

Så här konfigurerar du, skapar och kör exemplet

  1. Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.

  2. Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.

  3. Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel.