Sdílet prostřednictvím


OperationContextScope

Ukázka OperationContextScope ukazuje, jak odesílat další informace o volání WCF (Windows Communication Foundation) pomocí hlaviček. V této ukázce jsou server i klient konzolové aplikace.

Poznámka:

Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.

Ukázka ukazuje, jak klient může odeslat další informace jako MessageHeader použití OperationContextScope. Objekt OperationContextScope se vytvoří tak, že ho nasměruje na kanál. Do kolekce je možné přidat hlavičky, které je potřeba přeložit do OutgoingMessageHeaders vzdálené služby. Hlavičky přidané do této kolekce lze načíst ve službě pomocí přístupu IncomingMessageHeaders. Jeho volání se provádí v několika kanálech a hlavičky přidané do klienta se vztahují pouze na kanál, který byl použit k vytvoření OperationContextScope.

MessageHeaderReader

Toto je ukázková služba, která obdrží zprávu od klienta a pokusí se vyhledat hlavičku v kolekci IncomingMessageHeaders . Klient předá identifikátor GUID, který odeslal v hlavičce, a služba načte vlastní hlavičku a pokud je k dispozici, porovná ho s identifikátorem GUID předaným jako argument klienta.

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

Jedná se o klientskou implementaci, která ke komunikaci se vzdálenou službou používá proxy server vygenerovaný nástrojem ServiceModel Metadata Utility Tool (Svcutil.exe ). Nejprve vytvoří dva proxy objekty MessageHeaderReaderClient.

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

Klient pak vytvoří OperationContextScope a obory na client1. Přidá MessageHeader do OutgoingMessageHeaders obou klientů a vyvolá jedno volání. Tím zajistíte, že se hlavička odešle pouze zapnutá client1 , a ne tak client2 , že zkontroluje vrácenou RetrieveHeader hodnotu z volání.

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

Tato ukázka je v místním prostředí. K dispozici je následující ukázkový výstup spuštění ukázky:

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.

Nastavení, sestavení a spuštění ukázky

  1. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

  2. Pokud chcete sestavit edici C# nebo Visual Basic .NET řešení, postupujte podle pokynů v části Sestavení ukázek windows Communication Foundation.

  3. Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation.