Sdílet prostřednictvím


Protokol kontextové výměny

Tato část popisuje protokol výměny kontextu zavedený ve windows Communication Foundation (WCF) verze .NET Framework verze 3.5. Tento protokol umožňuje klientskému kanálu přijmout kontext zadaný službou a použít ho na všechny následné požadavky na tuto službu odeslané přes stejnou instanci kanálu klienta. Implementace protokolu pro výměnu kontextu může použít jeden z následujících dvou mechanismů k šíření kontextu mezi serverem a klientem: soubory cookie HTTP nebo hlavička SOAP.

Protokol pro výměnu kontextu se implementuje ve vlastní vrstvě kanálu. Kanál komunikuje s aplikační vrstvou a z aplikační vrstvy pomocí ContextMessageProperty vlastnosti. Pro přenos mezi koncovými body je hodnota kontextu buď serializována jako hlavička SOAP ve vrstvě kanálu, nebo převedena na nebo z vlastností zprávy, které představují požadavek HTTP a odpověď. V druhém případě se očekává, že jedna z podkladových vrstev kanálu převede vlastnosti požadavku HTTP a zprávy odpovědi na soubory cookie HTTP a z nich. Volba mechanismu použitého k výměně kontextu se provádí pomocí ContextExchangeMechanism vlastnosti v objektu ContextBindingElement. Platné hodnoty jsou HttpCookie nebo SoapHeader.

V klientovi může instance kanálu pracovat ve dvou režimech na základě nastavení vlastnosti kanálu , Enabled.

Režim 1: Správa kontextu kanálu

Toto je výchozí režim, ve kterém Enabled je nastaven .true V tomto režimu kontextový kanál spravuje kontext a ukládá kontext do mezipaměti během své životnosti. Kontext lze načíst z kanálu prostřednictvím vlastnosti IContextManager kanálu voláním GetContext metody. Kanál lze také předicializovat s konkrétním kontextem před otevřením voláním SetContext metody ve vlastnosti kanálu. Jakmile se kanál inicializuje s kontextem, nedá se resetovat.

Následuje seznam invariantů v tomto režimu:

  • Při každém pokusu o resetování kontextu po SetContext otevření kanálu dojde k vyvolání InvalidOperationException.

  • Jakýkoli pokus o odeslání kontextu pomocí ContextMessageProperty odchozí zprávy vyvolá InvalidOperationExceptionzprávu .

  • Pokud je zpráva přijata ze serveru s konkrétním kontextem, pokud kanál již byl inicializován s konkrétním kontextem, výsledkem je .ProtocolException

    Poznámka:

    Je vhodné přijmout počáteční kontext ze serveru pouze v případě, že je kanál otevřen bez explicitní sady kontextu.

  • Příchozí ContextMessageProperty zpráva je vždy null.

Režim 2: Správa kontextu aplikace

Toto je režim, pokud Enabled je nastaven na false. V tomto režimu kontextový kanál nespravuje kontext. Je zodpovědností aplikace načítat, spravovat a používat kontext pomocí nástroje ContextMessageProperty. Jakýkoli pokus o volání GetContext nebo SetContext výsledkem je .InvalidOperationException

Bez ohledu na to, který režim je zvolen objekt pro vytváření kanálů klienta podporuje IRequestChannel, IRequestSessionChannela IDuplexSessionChannel vzory výměny zpráv.

Ve službě je instance kanálu zodpovědná za převod kontextu zadaného klientem na příchozí zprávy na ContextMessageProperty. Vlastnost zprávy pak může být přístupná aplikační vrstvou nebo jinými kanály dále v zásobníku volání. Kanály služby také umožňují aplikační vrstvě zadat novou kontextovou hodnotu, která se má rozšířit zpět do klienta připojením ContextMessageProperty zprávy s odpovědí. Tato vlastnost je převedena na hlavičku SOAP nebo soubor cookie HTTP, který obsahuje kontext, který závisí na konfiguraci vazby. Naslouchací proces kanálu služby podporuje IReplyChannelIReplySessionChannelIReplySessionChannel a vzory výměny zpráv.

Protokol výměny kontextu zavádí novou wsc:Context hlavičku SOAP, která představuje kontextové informace v případech, kdy se k šíření kontextu nepoužívají soubory cookie HTTP. Schéma záhlaví kontextu umožňuje libovolný počet podřízených prvků, z nichž každý má řetězcový klíč a obsah řetězce. Následuje příklad hlavičky kontextu.

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

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

</Context>

HttpCookie V režimu se soubory cookie nastaví pomocí hlavičkySetCookie. Název souboru cookie je WscContext. Hodnota souboru cookie je kódování Base64 hlavičky wsc:Context . Tato hodnota je uzavřena v uvozovkách.

Hodnota kontextu musí být chráněna před úpravami během přenosu z důvodu ochrany hlaviček WS-Adresování – hlavička slouží k určení, kam odeslat požadavek do služby. Hlavička wsc:Context proto musí být digitálně podepsaná nebo podepsaná a šifrovaná na úrovni protokolu SOAP nebo přenosu, pokud vazba nabízí možnost ochrany zpráv. Pokud se k šíření kontextu používají soubory cookie HTTP, měly by být chráněny pomocí zabezpečení přenosu.

Koncové body služby, které vyžadují podporu protokolu výměny kontextu, můžou nastavit explicitně v publikovaných zásadách. Zavedli jsme dva nové kontrolní výrazy zásad, které představují požadavek, aby klient podporoval protokol výměny kontextu na úrovni SOAP nebo aby povolil podporu souborů cookie HTTP. Generování těchto kontrolních výrazů do zásad služby je řízeno hodnotou ContextExchangeMechanism vlastnosti následujícím způsobem:

  • V ContextSoapHeaderpřípadě se vygeneruje následující kontrolní výraz:

    <IncludeContext
    xmlns="http://schemas.microsoft.com/ws/2006/05/context"  
    protectionLevel="Sign" />  
    
  • V HttpCookiepřípadě se vygeneruje následující kontrolní výraz:

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

Viz také