KontextaustauschprotokollContext Exchange Protocol

In diesem Abschnitt wird beschrieben, die in Windows Communication Foundation (WCF) Version .NET Framework Version 3.5 eingeführte kontextaustauschprotokoll.This section describes the context exchange protocol introduced in Windows Communication Foundation (WCF) release .NET Framework version 3.5. Mithilfe dieses Protokolls kann vom Clientkanal ein vom Dienst bereitgestellter Kontext akzeptiert und für alle nachfolgenden Anforderungen übernommen werden, die über dieselbe Clientkanalinstanz an den Dienst gesendet werden.This protocol allows the client channel to accept a context supplied by a service and apply it to all subsequent requests to that service sent over the same client channel instance. Zur Implementierung des Kontextaustauschprotokolls kann einer der beiden folgenden Mechanismen verwendet werden, um den Kontext zwischen dem Server und dem Client zu propagieren: HTTP-Cookies oder ein SOAP-Header.The implementation of the context exchange protocol can use one of the following two mechanisms to propagate the context between the server and the client: HTTP cookies or a SOAP header.

Das Kontextaustauschprotokoll wird in einer benutzerdefinierten Kanalebene implementiert.The context exchange protocol is implemented in a custom channel layer. Der Kontext wird mithilfe der ContextMessageProperty-Eigenschaft von der Kanalebene an die Anwendungsebene (und umgekehrt) übermittelt.The channel communicates the context to and from the application layer using a ContextMessageProperty property. Zur Übertragung zwischen Endpunkten wird der Wert des Kontexts entweder auf der Kanalebene in einen SOAP-Header serialisiert oder in die bzw. aus den Nachrichteneigenschaften konvertiert, die eine HTTP-Anforderung bzw. eine HTTP-Antwort darstellen.For transmission between endpoints, the value of the context is either serialized as a SOAP header at the channel layer, or converted to or from the message properties that represent a HTTP request and response. Im zweiten Fall wird erwartet, das eine der zugrunde liegenden Kanalebenen die Eigenschaften der HTTP-Anforderungs- bzw. HTTP-Antwortnachrichten in bzw. aus HTTP-Cookies umwandelt.In the latter case, it is expected that one of the underlying channel layers converts the HTTP request and response message properties to and from HTTP cookies, respectively. Der für den Kontextaustausch zu verwendende Mechanismus wird mithilfe der ContextExchangeMechanism-Eigenschaft für das ContextBindingElement ausgewähltThe choice of the mechanism used to exchange the context is done using the ContextExchangeMechanism property on the ContextBindingElement. Gültige Werte sind HttpCookie und SoapHeader.Valid values are HttpCookie or SoapHeader.

Auf dem Client kann eine Kanalinstanz abhängig von der Einstellung der Kanaleigenschaft Enabled in zwei Modi arbeiten.On the client, an instance of a channel can operate in two modes based on the settings on the channel property, Enabled.

Modus 1: KanalkontextverwaltungMode 1: Channel Context Management

Dies ist der Standardmodus, wobei Enabled auf true festgelegt wird.This is the default mode where Enabled is set to true. In diesem Modus verwaltet der Kontextkanal den Kontext und speichert den Kontext während seiner Lebensdauer zwischen.In this mode the context channel manages the context and caches the context during its lifetime. Der Kontext kann über die Kanaleigenschaft IContextManager durch einen Aufruf der GetContext-Methode vom Kanal abgerufen werden.Context can be retrieved from the channel through channel property IContextManager by calling the GetContext method. Der Kanal kann auch vor dem Öffnen vorab mit einem bestimmten Kontext initialisiert werden, indem die SetContext-Methode für die Kanaleigenschaft aufgerufen wird.The channel can also be pre-initialized with specific context before being opened by calling the SetContext method on the channel property. Sobald der Kanal mit einem Kontext initialisiert wurde, kann er nicht mehr zurückgesetzt werden.Once the channel is initialized with context it cannot be reset.

Im Folgenden finden Sie eine Liste der Dinge, die in diesem Modus nicht verändert werden können:The following is a list of invariants in this mode:

  • Jeder Versuch, den Kontext mit SetContext zurückzusetzen, nachdem der Kanal geöffnet wurde, löst eine InvalidOperationException aus.Any attempt to reset the context using SetContext after the channel has been opened throws an InvalidOperationException.

  • Jeder Versuch, Kontext mithilfe der ContextMessageProperty in einer ausgehenden Nachricht zu senden, löst eine InvalidOperationException aus.Any attempt to send context by using the ContextMessageProperty in an outgoing message throws an InvalidOperationException.

  • Wenn eine Nachricht mit einem bestimmten Kontext vom Server empfangen wird, dann wird eine ProtocolException ausgelöst, wenn der Kanal bereits mit einem bestimmten Kontext initialisiert wurde.If a message is received from server with a specific context, when the channel has already been initialized with a specific context, this results in a ProtocolException.

    Hinweis

    Der Empfang eines Anfangskontexts vom Server ist nur dann angemessen, wenn der Kanal geöffnet wird, ohne dass explizit ein Kontext festgelegt wird.It is appropriate to receive an initial context from the server only if the channel is opened without any context set explicitly.

  • Bei eingehenden Nachrichten hat ContextMessageProperty stets den Wert NULL.The ContextMessageProperty on incoming message is always null.

Modus 2: AnwendungskontextverwaltungMode 2: Application Context Management

Dieser Modus wird verwendet, wenn Enabled auf false festgelegt wurde.This is the mode when Enabled is set to false. In diesem Modus verwaltet der Kontextkanal keinen Kontext.In this mode the context channel does not manage context. Es liegt in der Verantwortung der Anwendung, den Kontext mithilfe von ContextMessageProperty abzurufen, zu verwalten und zu übernehmen.It is the application's responsibility to retrieve, manage and apply context by using the ContextMessageProperty. Jeder Versuch, GetContext oder SetContext aufzurufen, führt zu einer InvalidOperationException.Any attempt to call GetContext or SetContext results in an InvalidOperationException.

Unabhängig vom ausgewählten Modus unterstützt die Clientkanalfactory die Nachrichtenaustauschmuster IRequestChannel, IRequestSessionChannel und IDuplexSessionChannel.No matter which mode is chosen the client channel factory supports IRequestChannel, IRequestSessionChannel, and IDuplexSessionChannel message exchange patterns.

Auf der Dienstseite ist eine Instanz des Kanals für die Konvertierung des vom Client in eingehenden Nachrichten bereitgestellten Kontexts in eine ContextMessageProperty-Eigenschaft verantwortlich.On the service, an instance of the channel is responsible for converting the context supplied by the client on incoming messages to the ContextMessageProperty. Die Anwendungsebene oder andere Kanäle weiter oben im Aufrufstapel können dann auf diese Nachrichteneigenschaft zugreifen.The message property can then be accessed by the application layer or other channels further up in the call stack. Die Dienstkanäle erlauben es der Anwendungsebene auch, einen neuen Kontextwert anzugeben, der zurück zum Client übermittelt werden soll, indem der Antwortnachricht eine ContextMessageProperty angehängt wird.The service channels also allow the application layer to specify a new context value to be propagated back to the client by attaching a ContextMessageProperty to the response message. Diese Eigenschaft wird in einen SOAP-Header oder ein HTTP-Cookie umgewandelt, der bzw. das den Kontext enthält, der von der Konfiguration der Bindung abhängt.This property is converted to the SOAP header or HTTP cookie that contains the context, which depends on the configuration of the binding. Der Dienstkanallistener unterstützt die Nachrichtenaustauschmuster IReplyChannel, IReplySessionChannel und IReplySessionChannel.The service channel listener supports IReplyChannel, IReplySessionChannel, and IReplySessionChannel message exchange patterns.

Das Kontextaustauschprotokoll führt den neuen SOAP-Header wsc:Context ein, der zur Darstellung der Kontextinformationen dient, wenn der Kontext nicht mithilfe von HTTP-Cookies übermittelt wird.The context exchange protocol introduces a new wsc:Context SOAP header to represent the context information when HTTP cookies are not used to propagate the context. Das Kontextheaderschema lässt eine beliebige Anzahl untergeordneter Elemente zu, die jeweils einen Zeichenfolgenschlüssel und Zeichenfolgeninhalt enthalten.The context header schema allows for any number of child elements, each with a string key and string content. Es folgt ein Beispiel für einen Kontextheader.The following is an example of a context header.

<Context xmlns="http://schemas.microsoft.com/ws/2006/05/context">

<property name="myContext">context-2</property>

</Context>

Im HttpCookie-Modus werden Cookies mit dem SetCookie-Header festgelegt.When in HttpCookie mode, cookies are set using the SetCookie header. Der Cookiename lautet WscContext.The cookie name is WscContext. Der Wert des Cookies entspricht der Base64-Codierung des wsc:Context-Headers.The value of the cookie is the Base64 encoding of the wsc:Context header. Dieser Wert wird in Anführungszeichen eingeschlossen.This value is enclosed in quotes.

Der Wert des Kontexts muss während der Übermittlung aus den gleichen Gründen vor Veränderungen geschützt werden, aus denen WS-Adressierungsheader geschützt werden: Anhand des Headers wird ermittelt, an welchen Endpunkt im Dienst die Anforderung weitergeleitet werden soll.The value of the context must be protected from modification while in transit for the same reason WS-Addressing headers are protected – the header is used to determine where to dispatch the request to on the service. Deshalb muss der wsc:Context-Header entweder auf SOAP- oder auf Transportebene digital signiert und verschlüsselt werden, wenn für die Bindung ein Nachrichtenschutz verfügbar ist.The wsc:Context header is therefore required to be digitally signed or signed and encrypted at either the SOAP or transport level when the binding offers message protection capability. Werden zum Weitergeben von Kontext HTTP-Cookies verwendet, sollten diese mithilfe der Transportsicherheit geschützt werden.When HTTP cookies are used to propagate context, they should be protected using transport security.

Für Dienstendpunkte, bei denen die Unterstützung des Kontextaustauschprotokolls erforderlich ist, kann diese Anforderung in der veröffentlichten Richtlinie als explizite Anforderung festgelegt werden.Service endpoints that require support for the context exchange protocol can make it explicit in the published policy. Es wurden zwei neue Richtlinienassertionen eingeführt, die die Anforderung des Clients zur Unterstützung des Kontextaustauschprotokolls auf SOAP-Ebene oder das Aktivieren der Unterstützung von HTTP-Cookies darstellen.Two new policy assertions have been introduced to represent the requirement for the client to support the context exchange protocol at the SOAP level or to enable HTTP cookie support. Die Generierung dieser Assertionen in der Richtlinie auf Dienstseite wird vom Wert der ContextExchangeMechanism-Eigenschaft folgendermaßen gesteuert:Generation of these assertions into the policy on the service is controlled by the value of the ContextExchangeMechanism property as follows:

  • Für ContextSoapHeader wird die folgende Assertion generiert:For ContextSoapHeader, the following assertion is generated:

    <IncludeContext   
    xmlns="http://schemas.microsoft.com/ws/2006/05/context"  
    protectionLevel="Sign" />  
    
  • Für HttpCookie wird die folgende Assertion generiert:For HttpCookie, the following assertion is generated:

    <HttpUseCookie xmlns="http://schemas.xmlsoap.org/soap/http"/>  
    

Siehe auchSee Also

Leitfaden für die Interoperabilität von WebdienstprotokollenWeb Services Protocols Interoperability Guide