Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 demonstruje, jak klient může odeslat další informace jako MessageHeader pomocí OperationContextScope. Objekt OperationContextScope se vytvoří tak, že ho nasměruje na kanál. Hlavičky, které musí být přeloženy pro vzdálenou službu, lze přidat do OutgoingMessageHeaders kolekce. 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.
Čtečka zprávových záhlaví
Toto je ukázková služba, která obdrží zprávu od klienta a pokusí se vyhledat hlavičku v kolekci IncomingMessageHeaders . Klient předá službě identifikátor GUID, který odeslal v hlavičce, a služba načte tuto vlastní hlavičku. Pokud je vlastní hlavička přítomna, porovná ji 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 nastaví jej pro client1. Přidá MessageHeader do OutgoingMessageHeaders a vyvolá jedno volání na obou klientech. Zajišťuje, že se hlavička odešle pouze na client1 a nikoli na client2 kontrolou návratové hodnoty z volání 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));
}
Tato ukázka je hostována interně. K dispozici je následující ukázkový výstup z běhu 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.
Jak nastavit, sestavit a spustit ukázku
Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.
Pokud chcete sestavit verzi C# nebo Visual Basic .NET řešení, postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.
Pokud chcete spustit ukázku v konfiguraci pro jeden počítač nebo pro více počítačů, postupujte podle pokynů v Spuštění ukázek Windows Communication Foundation.