Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 / Notatka
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 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 tej usłudze, uzyskując dostęp do 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.
OdczytywaczNagłówkówWiadomości
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 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 ustala jego zakres dla client1. Dodaje MessageHeader do OutgoingMessageHeaders i wywołuje jedno połączenie na obu klientach. Gwarantuje to, że nagłówek jest wysyłany tylko na client1, a nie na client2, poprzez sprawdzenie wartości zwracanej 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));
}
Ta próbka jest hostowana 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ładowy program
Upewnij się, że wykonano procedurę instalacji One-Time 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 Kompilowanie przykładów Windows Communication Foundation.
Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w Uruchamianie przykładów programu Windows Communication Foundation.