Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Im Beispiel "OperationContextScope " wird veranschaulicht, wie zusätzliche Informationen über einen WCF-Aufruf (Windows Communication Foundation) mithilfe von Headern gesendet werden. In diesem Beispiel sind sowohl der Server als auch der Client Konsolenanwendungen.
Hinweis
Die Einrichtungsverfahren und Build-Anweisungen für dieses Beispiel befinden sich am Ende dieses Themas.
Das Beispiel veranschaulicht, wie ein Client zusätzliche Informationen als MessageHeader mit OperationContextScope senden kann. Ein OperationContextScope Objekt wird erstellt, indem es einem Kanal zugeordnet wird. Die Header, die an den Remotedienst übertragen werden müssen, können der OutgoingMessageHeaders-Auflistung hinzugefügt werden. Dieser Auflistung hinzugefügte Header können im Dienst durch den Zugriff auf IncomingMessageHeaders abgerufen werden. Die Anrufe werden in mehreren Kanälen ausgeführt, und dann gelten die Kopfzeilen, die dem Client hinzugefügt wurden, nur für den Kanal, der zum Erstellen des OperationContextScopeKanals verwendet wurde.
MessageHeaderReader
Dies ist der Beispieldienst, der eine Nachricht vom Client empfängt und versucht, die Kopfzeile in der IncomingMessageHeaders Sammlung nachzuschlagen. Der Client übergibt die GUID, die er in der Kopfzeile gesendet hat, und der Dienst ruft den benutzerdefinierten Header ab und vergleicht sie, falls vorhanden, mit der GUID, die als Argument vom Client übergeben wird.
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
Dies ist die Clientimplementierung, die den von ServiceModel Metadata Utility Tool (Svcutil.exe) generierten Proxy verwendet, um mit dem Remotedienst zu kommunizieren. Zunächst werden zwei Proxyobjekte von MessageHeaderReaderClient erstellt.
//Create two clients to the remote service.
MessageHeaderReaderClient client1 = new MessageHeaderReaderClient();
MessageHeaderReaderClient client2 = new MessageHeaderReaderClient();
Der Client erstellt dann OperationContextScope und bewertet ihn zu client1. Es fügt ein MessageHeader zu OutgoingMessageHeaders hinzu und führt einen Aufruf bei beiden Clients aus. Dadurch wird sichergestellt, dass die Kopfzeile nur an client1 gesendet und nicht an client2 gesendet wird, indem der Rückgabewert aus dem RetrieveHeader aufruf überprüft wird.
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));
}
Dieses Beispiel ist selbst gehostet. Es wird die folgende Beispielausgabe vom Ausgeben des Beispiels bereitgestellt:
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.
So können Sie das Beispiel einrichten, erstellen und ausführen
Stellen Sie sicher, dass Sie das One-Time Setup-Verfahren für die Windows Communication Foundation-Beispieleausgeführt haben.
Um die C#- oder Visual Basic .NET-Edition der Lösung zu erstellen, befolgen Sie die Anweisungen in Building the Windows Communication Foundation Samples.
Wenn Sie das Beispiel in einer Konfiguration mit einem Computer oder über Computer hinweg ausführen möchten, folgen Sie den Anweisungen unter Durchführen der Windows Communication Foundation-Beispiele.