Udostępnij przez


Protokół wymiany kontekstu

W tej sekcji opisano protokół wymiany kontekstu wprowadzony w programie Windows Communication Foundation (WCF) w wersji .NET Framework w wersji 3.5. Ten protokół umożliwia kanałowi klienta akceptowanie kontekstu dostarczonego przez usługę i stosowanie go do wszystkich kolejnych żądań do tej usługi wysyłanych przez to samo wystąpienie kanału klienta. Implementacja protokołu wymiany kontekstu może użyć jednego z następujących dwóch mechanizmów do propagowania kontekstu między serwerem a klientem: pliki cookie HTTP lub nagłówek PROTOKOŁU SOAP.

Protokół wymiany kontekstu jest implementowany w niestandardowej warstwie kanału. Kanał komunikuje kontekst do i z warstwy aplikacji przy użyciu ContextMessageProperty właściwości . W przypadku transmisji między punktami końcowymi wartość kontekstu jest serializowana jako nagłówek PROTOKOŁU SOAP w warstwie kanału lub konwertowana na lub z właściwości komunikatu reprezentujących żądanie HTTP i odpowiedź. W tym drugim przypadku oczekuje się, że jedna z bazowych warstw kanałów konwertuje właściwości żądania i odpowiedzi HTTP na pliki cookie HTTP i odwrotnie. Wybór mechanizmu używanego do wymiany kontekstu odbywa się przy użyciu ContextExchangeMechanism właściwości na ContextBindingElement. Prawidłowe wartości to HttpCookie lub SoapHeader.

Na kliencie wystąpienie kanału może działać w dwóch trybach, na podstawie ustawień właściwości kanału Enabled.

Tryb 1. Zarządzanie kontekstem kanału

Jest to tryb domyślny, w którym Enabled jest ustawione na true. W tym trybie kanał kontekstowy zarządza kontekstem i buforuje kontekst w okresie jego istnienia. Kontekst można pobrać z kanału za pośrednictwem właściwości IContextManager kanału, wywołując metodę GetContext . Kanał może być również wstępnie zainicjowany z określonym kontekstem, zanim zostanie otwarty, poprzez wywołanie metody SetContext na właściwości kanału. Po zainicjowaniu kanału z kontekstem nie można go zresetować.

Poniżej znajduje się lista niezmiennych elementów w tym trybie:

  • Każda próba zresetowania kontekstu przy użyciu polecenia SetContext po otwarciu kanału zgłasza błąd InvalidOperationException.

  • Każda próba wysłania kontekstu przy użyciu elementu ContextMessageProperty w wiadomości wychodzącej zgłasza błąd InvalidOperationException.

  • Jeśli wiadomość zostanie odebrana z serwera z określonym kontekstem, gdy kanał został już zainicjowany z tym samym kontekstem, spowoduje to ProtocolException.

    Uwaga / Notatka

    Należy odbierać kontekst początkowy z serwera tylko wtedy, gdy kanał jest otwarty bez ustawienia kontekstu.

  • Komunikat ContextMessageProperty przychodzący zawsze ma wartość null.

Tryb 2. Zarządzanie kontekstem aplikacji

Jest to tryb, gdy Enabled jest ustawiony na false. W tym trybie kanał kontekstowy nie zarządza kontekstem. Jest to odpowiedzialność aplikacji za pobieranie kontekstu, zarządzanie nim i stosowanie go przy użyciu elementu ContextMessageProperty. Każda próba wywołania GetContext lub SetContext skutkuje InvalidOperationException.

Niezależnie od tego, który tryb zostanie wybrany, fabryka kanałów klienta obsługuje wzorce wymiany komunikatów IRequestChannel, IRequestSessionChannel i IDuplexSessionChannel.

W usłudze instancja kanału jest odpowiedzialna za konwersję kontekstu dostarczonego przez klienta w związku z przychodzącymi komunikatami na ContextMessageProperty. Następnie można uzyskać dostęp do właściwości komunikatu przez warstwę aplikacji lub inne kanały dalej w stosie wywołań. Kanały usług umożliwiają również warstwie aplikacji określenie nowej wartości kontekstu, która ma być propagowana z powrotem do klienta, dołączając element do ContextMessageProperty komunikatu odpowiedzi. Ta właściwość jest konwertowana na nagłówek PROTOKOŁU SOAP lub plik cookie HTTP zawierający kontekst, który zależy od konfiguracji powiązania. Odbiornik kanału usługi obsługuje wzorce wymiany komunikatów IReplyChannel, IReplySessionChannel i IReplySessionChannel.

Protokół wymiany kontekstu wprowadza nowy wsc:Context nagłówek SOAP, który reprezentuje informacje kontekstowe, gdy ciasteczka HTTP nie są używane do propagowania kontekstu. Schemat nagłówka kontekstu umożliwia dowolną liczbę elementów podrzędnych, z których każda ma klucz ciągu i zawartość ciągu. Poniżej przedstawiono przykład nagłówka kontekstu.

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

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

</Context>

W HttpCookie trybie pliki cookie są ustawiane przy użyciu nagłówka SetCookie . Nazwa pliku cookie to WscContext. Wartość pliku cookie to kodowanie Base64 nagłówka wsc:Context. Ta wartość jest ujęta w cudzysłów.

Wartość kontekstu musi być chroniona przed modyfikacją podczas przesyłania, tak jak chronione są nagłówki WS-Addressing, ponieważ nagłówek jest używany do określenia, gdzie należy przesłać żądanie do usługi. Dlatego nagłówek wsc:Context musi być podpisany cyfrowo lub podpisany i zaszyfrowany na poziomie protokołu SOAP albo transportu, gdy powiązanie oferuje możliwość ochrony komunikatów. Gdy pliki cookie HTTP są używane do propagowania kontekstu, powinny być chronione przy użyciu zabezpieczeń transportu.

Punkty końcowe usługi, które wymagają obsługi protokołu wymiany kontekstu, mogą jawnie określić je w opublikowanych zasadach. Wprowadzono dwie nowe asercje zasad, aby reprezentować wymaganie, aby klient obsługiwał protokół wymiany kontekstu na poziomie protokołu SOAP lub obsługiwał pliki cookie HTTP. Generowanie tych asercji do polityki usługi jest kontrolowane przez wartość właściwości ContextExchangeMechanism w następujący sposób:

  • W przypadku ContextSoapHeader jest generowane następujące potwierdzenie:

    <IncludeContext
    xmlns="http://schemas.microsoft.com/ws/2006/05/context"  
    protectionLevel="Sign" />  
    
  • W przypadku HttpCookie jest generowane następujące potwierdzenie:

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

Zobacz także