Udostępnij za pośrednictwem


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 odpowiednio właściwości żądania HTTP i komunikatu odpowiedzi na pliki cookie HTTP i z nich. Wybór mechanizmu używanego do wymiany kontekstu odbywa się przy użyciu ContextExchangeMechanism właściwości w obiekcie ContextBindingElement. Prawidłowe wartości to HttpCookie i SoapHeader.

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

Tryb 1. Zarządzanie kontekstem kanału

Jest to tryb domyślny, w którym Enabled ustawiono wartość 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 przed otwarciem przez wywołanie SetContext metody we 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 ContextMessageProperty elementu w komunikacie wychodzącym zgłasza błąd InvalidOperationException.

  • Jeśli komunikat zostanie odebrany z serwera z określonym kontekstem, gdy kanał został już zainicjowany z określonym kontekstem, spowoduje to wyświetlenie ProtocolExceptionelementu .

    Uwaga

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

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

Tryb 2. Zarządzanie kontekstem aplikacji

Jest to tryb ustawiony Enabled na falsewartość . 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 metody lub SetContext spowoduje wyświetlenie GetContext elementu InvalidOperationException.

Niezależnie od tego, który tryb jest wybierany, fabryka kanałów klienta obsługuje IRequestChannelwzorce wymiany komunikatów , IRequestSessionChanneli .IDuplexSessionChannel

W usłudze wystąpienie kanału jest odpowiedzialne za konwertowanie kontekstu dostarczonego przez klienta na komunikaty przychodzące 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 IReplyChannelwzorce wymiany komunikatów , IReplySessionChanneli IReplySessionChannel .

Protokół wymiany kontekstu wprowadza nowy wsc:Context nagłówek protokołu SOAP do reprezentowania informacji kontekstowych, gdy pliki cookie 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łowy.

Wartość kontekstu musi być chroniona przed modyfikacją, podczas gdy podczas przesyłania z tego samego powodu nagłówki adresowania WS-Addressing są chronione — nagłówek służy do określania miejsca wysyłania żądania do usługi. W wsc:Context związku z tym nagłówek musi być podpisany cyfrowo lub podpisany i zaszyfrowany na poziomie protokołu SOAP lub transportu, gdy powiązanie zapewnia 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 dwa nowe asercji zasad, aby reprezentować wymaganie, aby klient obsługiwał protokół wymiany kontekstu na poziomie protokołu SOAP lub włączyć obsługę plików cookie HTTP. Generowanie tych asercji w zasadach usługi jest kontrolowane przez wartość ContextExchangeMechanism właściwości w następujący sposób:

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

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

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

Zobacz też