Context Exchange Protocol
In deze sectie wordt het contextuitwisselingsprotocol beschreven dat is geïntroduceerd in wcf-versie (Windows Communication Foundation) .NET Framework versie 3.5. Met dit protocol kan het clientkanaal een context accepteren die wordt geleverd door een service en deze toepassen op alle volgende aanvragen voor die service die via hetzelfde clientkanaalexemplaren worden verzonden. De implementatie van het contextuitwisselingsprotocol kan een van de volgende twee mechanismen gebruiken om de context tussen de server en de client door te geven: HTTP-cookies of een SOAP-header.
Het contextuitwisselingsprotocol wordt geïmplementeerd in een aangepaste kanaallaag. Het kanaal communiceert de context van en naar de toepassingslaag met behulp van een ContextMessageProperty eigenschap. Voor verzending tussen eindpunten wordt de waarde van de context geserialiseerd als soap-header op de kanaallaag, of geconverteerd naar of van de berichteigenschappen die een HTTP-aanvraag en -antwoord vertegenwoordigen. In het laatste geval wordt verwacht dat een van de onderliggende kanaallagen respectievelijk de eigenschappen van de HTTP-aanvraag en het antwoordbericht converteert naar en van HTTP-cookies. De keuze van het mechanisme dat wordt gebruikt voor het uitwisselen van de context wordt uitgevoerd met behulp van de ContextExchangeMechanism eigenschap op de ContextBindingElement. Geldige waarden zijn HttpCookie
of SoapHeader
.
Op de client kan een exemplaar van een kanaal in twee modi worden uitgevoerd op basis van de instellingen van de kanaaleigenschap. Enabled
Modus 1: Beheer van kanaalcontext
Dit is de standaardmodus waarop Enabled is ingesteld op true
. In deze modus beheert het contextkanaal de context en slaat de context tijdens de levensduur in de cache op. Context kan worden opgehaald uit het kanaal via kanaaleigenschap IContextManager
door de methode aan te GetContext
roepen. Het kanaal kan ook vooraf worden geïnitialiseerd met specifieke context voordat het wordt geopend door de SetContext
methode op de kanaaleigenschap aan te roepen. Zodra het kanaal is geïnitialiseerd met context, kan het niet opnieuw worden ingesteld.
Hier volgt een lijst met invarianten in deze modus:
Elke poging om de context opnieuw in te stellen met behulp van
SetContext
nadat het kanaal is geopend, genereert een InvalidOperationException.Elke poging om context te verzenden met behulp van het ContextMessageProperty in een uitgaand bericht genereert een InvalidOperationException.
Als een bericht wordt ontvangen van de server met een specifieke context, wanneer het kanaal al is geïnitialiseerd met een specifieke context, resulteert dit in een ProtocolException.
Notitie
Het is geschikt om alleen een initiële context van de server te ontvangen als het kanaal wordt geopend zonder dat er expliciet context is ingesteld.
Het ContextMessageProperty on-inkomende bericht is altijd null.
Modus 2: Toepassingscontextbeheer
Dit is de modus wanneer Enabled deze is ingesteld op false
. In deze modus beheert het contextkanaal geen context. Het is de verantwoordelijkheid van de toepassing om context op te halen, te beheren en toe te passen met behulp van de ContextMessageProperty. Elke poging om een aanroep GetContext
of SetContext
resultaten in een InvalidOperationException.
Ongeacht welke modus wordt gekozen door de clientkanaalfactory, IRequestChannelIRequestSessionChannelen patronen voor IDuplexSessionChannel het uitwisselen van berichten.
Op de service is een exemplaar van het kanaal verantwoordelijk voor het converteren van de context die door de client wordt geleverd bij binnenkomende berichten naar de ContextMessageProperty. De berichteigenschap kan vervolgens worden geopend door de toepassingslaag of andere kanalen verderop in de aanroepstack. Met de servicekanalen kan de toepassingslaag ook een nieuwe contextwaarde opgeven die naar de client moet worden doorgegeven door een ContextMessageProperty aan het antwoordbericht te koppelen. Deze eigenschap wordt geconverteerd naar de SOAP-header of HTTP-cookie die de context bevat, afhankelijk van de configuratie van de binding. De servicekanaallistener ondersteunt IReplyChannelpatronen voor het IReplySessionChanneluitwisselen van berichten en IReplySessionChannel berichten.
Het contextuitwisselingsprotocol introduceert een nieuwe wsc:Context
SOAP-header om de contextinformatie weer te geven wanneer HTTP-cookies niet worden gebruikt om de context door te geven. Het contextheaderschema biedt elk gewenst aantal onderliggende elementen, elk met een tekenreekssleutel en tekenreeksinhoud. Hier volgt een voorbeeld van een contextheader.
<Context xmlns="http://schemas.microsoft.com/ws/2006/05/context">
<property name="myContext">context-2</property>
</Context>
HttpCookie
In de modus worden cookies ingesteld met behulp van de SetCookie
koptekst. De cookienaam is WscContext
. De waarde van de cookie is de Base64-codering van de wsc:Context
header. Deze waarde staat tussen aanhalingstekens.
De waarde van de context moet worden beveiligd tegen wijziging terwijl deze om dezelfde reden als WS-Adresseringsheaders worden beveiligd. De header wordt gebruikt om te bepalen waar de aanvraag naar de service moet worden verzonden. De wsc:Context
header moet daarom digitaal worden ondertekend of ondertekend en versleuteld op soap- of transportniveau wanneer de binding berichtbeveiliging biedt. Wanneer HTTP-cookies worden gebruikt om context door te geven, moeten ze worden beveiligd met transportbeveiliging.
Service-eindpunten waarvoor ondersteuning voor het contextuitwisselingsprotocol is vereist, kunnen dit expliciet maken in het gepubliceerde beleid. Er zijn twee nieuwe beleidsverklaringen geïntroduceerd om de vereiste te vertegenwoordigen dat de client het contextuitwisselingsprotocol op SOAP-niveau ondersteunt of http-cookieondersteuning mogelijk maakt. Het genereren van deze asserties in het beleid voor de service wordt als volgt bepaald door de waarde van de ContextExchangeMechanism eigenschap:
Voor ContextSoapHeaderwordt de volgende assertie gegenereerd:
<IncludeContext xmlns="http://schemas.microsoft.com/ws/2006/05/context" protectionLevel="Sign" />
Voor HttpCookiewordt de volgende assertie gegenereerd:
<HttpUseCookie xmlns="http://schemas.xmlsoap.org/soap/http"/>