OperationContextScope
W przykładzie OperationContextScope pokazano, jak wysyłać dodatkowe informacje w wywołaniu programu Windows Communication Foundation (WCF) przy użyciu nagłówków. W tym przykładzie zarówno serwer, jak i klient to aplikacje konsolowe.
Uwaga
Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.
W przykładzie pokazano, jak klient może wysyłać dodatkowe informacje jako MessageHeader przy użyciu polecenia OperationContextScope. Obiekt OperationContextScope jest tworzony przez określenie zakresu do kanału. Nagłówki, które należy przetłumaczyć na usługę zdalną, można dodać do kolekcji OutgoingMessageHeaders . Nagłówki dodane do tej kolekcji można pobrać w usłudze, korzystając z elementu IncomingMessageHeaders. Jego wywołania są wykonywane na wielu kanałach, a następnie nagłówki dodane do klienta dotyczą tylko kanału, który został użyty do utworzenia elementu OperationContextScope.
MessageHeaderReader
Jest to przykładowa usługa, która odbiera komunikat od klienta i próbuje wyszukać nagłówek w kolekcji IncomingMessageHeaders . Klient przekazuje identyfikator GUID, który został wysłany w nagłówku, a usługa pobiera nagłówek niestandardowy, a jeśli jest obecny, porównuje go z identyfikatorem GUID przekazanym jako argument przez 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
Jest to implementacja klienta, która używa serwera proxy wygenerowanego przez narzędzie ServiceModel Metadata Utility Tool (Svcutil.exe) do komunikowania się z usługą zdalną. Najpierw tworzy dwa obiekty serwera proxy .MessageHeaderReaderClient
//Create two clients to the remote service.
MessageHeaderReaderClient client1 = new MessageHeaderReaderClient();
MessageHeaderReaderClient client2 = new MessageHeaderReaderClient();
Następnie klient tworzy element OperationContextScope i określa zakresy dla client1
elementu . Dodaje element MessageHeader i OutgoingMessageHeaders wywołuje jedno wywołanie na obu klientach. Gwarantuje to, że nagłówek jest wysyłany tylko do client1
elementu i nie jest włączony client2
, sprawdzając wartość zwracaną z wywołania 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));
}
Ten przykład jest hostowany samodzielnie. Dostępne są następujące przykładowe dane wyjściowe z uruchamiania przykładu:
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.
Aby skonfigurować, skompilować i uruchomić przykład
Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.
Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).
Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.