다음을 통해 공유


컨텍스트 교환 프로토콜

이 섹션에서는 WCF(Windows Communication Foundation) 릴리스 .NET Framework 버전 3.5에 도입된 컨텍스트 교환 프로토콜에 대해 설명합니다. 이 프로토콜을 사용하면 클라이언트 채널이 서비스에서 제공하는 컨텍스트를 수락하고 동일한 클라이언트 채널 인스턴스를 통해 전송된 해당 서비스에 대한 모든 후속 요청에 적용할 수 있습니다. 컨텍스트 교환 프로토콜의 구현은 다음 두 메커니즘 중 하나를 사용하여 서버와 클라이언트 간에 컨텍스트를 전파할 수 있습니다. HTTP 쿠키 또는 SOAP 헤더.

컨텍스트 교환 프로토콜은 사용자 지정 채널 계층에서 구현됩니다. 채널은 속성을 사용하여 ContextMessageProperty 애플리케이션 계층과 컨텍스트를 통신합니다. 엔드포인트 간 전송의 경우 컨텍스트 값은 채널 계층에서 SOAP 헤더로 직렬화되거나 HTTP 요청 및 응답을 나타내는 메시지 속성으로 변환됩니다. 후자의 경우, 기본 채널 계층 중 하나가 HTTP 요청 및 응답 메시지 속성을 HTTP 쿠키로 변환하거나, HTTP 쿠키에서 요청 및 응답 메시지 속성으로 변환할 것으로 예상됩니다. 컨텍스트를 교환하는 데 사용되는 메커니즘 선택은 .의 속성을 사용하여 ContextExchangeMechanism 수행됩니다 ContextBindingElement. 유효한 값은 HttpCookie 또는 SoapHeader.

클라이언트에서 채널 인스턴스는 채널 속성 Enabled의 설정에 따라 두 가지 모드로 작동할 수 있습니다.

모드 1: 채널 컨텍스트 관리

이것은 Enabledtrue로 설정된 기본 모드입니다. 이 모드에서 컨텍스트 채널은 컨텍스트를 관리하고 해당 수명 동안 컨텍스트를 캐시합니다. 메서드를 호출하여 IContextManager 속성을 통해 채널에서 컨텍스트를 검색할 수 있습니다. 채널 속성에서 메서드를 호출 SetContext 하여 열기 전에 특정 컨텍스트를 사용하여 채널을 미리 초기화할 수도 있습니다. 채널이 컨텍스트를 사용하여 초기화되면 다시 설정할 수 없습니다.

다음은 이 모드의 불변 항목들 목록입니다.

  • 채널이 열린 후 SetContext을 사용하여 컨텍스트를 다시 설정하려는 모든 시도는 InvalidOperationException 예외를 발생시킵니다.

  • 보내는 메시지에서 ContextMessageProperty를 사용하여 컨텍스트를 보내려는 모든 시도는 InvalidOperationException를 throw합니다.

  • 특정 컨텍스트가 있는 서버에서 메시지를 수신하는 경우 채널이 특정 컨텍스트로 이미 초기화되면 이 결과가 발생합니다 ProtocolException.

    비고

    명시적으로 컨텍스트 집합 없이 채널을 연 경우에만 서버에서 초기 컨텍스트를 수신하는 것이 좋습니다.

  • ContextMessageProperty가 포함된 들어오는 메시지는 항상 null입니다.

모드 2: 애플리케이션 컨텍스트 관리

Enabledfalse로 설정될 때의 모드입니다. 이 모드에서는 컨텍스트 채널이 컨텍스트를 관리하지 않습니다. 를 사용하여 ContextMessageProperty컨텍스트를 검색, 관리 및 적용하는 것은 애플리케이션의 책임입니다. GetContext 또는 SetContext를 호출하려고 시도하면 InvalidOperationException가 발생합니다.

어떤 모드를 선택하든 클라이언트 채널 팩터리는 IRequestChannel, IRequestSessionChannel, IDuplexSessionChannel 메시지 교환 패턴을 지원합니다.

서비스에서 채널의 인스턴스는 들어오는 메시지에 대해 클라이언트가 제공하는 컨텍스트를 변환하는 작업을 ContextMessageProperty담당합니다. 그런 다음, 호출 스택의 애플리케이션 계층 또는 다른 채널에서 메시지 속성에 액세스할 수 있습니다. 또한 서비스 채널을 사용하면 애플리케이션 계층에서 응답 메시지에 연결 ContextMessageProperty 하여 클라이언트에 다시 전파할 새 컨텍스트 값을 지정할 수 있습니다. 이 속성은 바인딩의 구성에 따라 달라지는 컨텍스트를 포함 하는 SOAP 헤더 또는 HTTP 쿠키로 변환 됩니다. 서비스 채널 수신기는 IReplyChannel, IReplySessionChannel, 및 IReplySessionChannel 메시지 교환 패턴을 지원합니다.

컨텍스트 교환 프로토콜은 HTTP 쿠키를 사용하여 컨텍스트를 전파하지 않을 때 컨텍스트 정보를 나타내는 새 wsc:Context SOAP 헤더를 도입합니다. 컨텍스트 헤더 스키마는 문자열 키와 문자열 콘텐츠가 있는 자식 요소의 수를 허용합니다. 다음은 컨텍스트 헤더의 예입니다.

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

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

</Context>

HttpCookie 모드일 때 쿠키는 SetCookie 헤더를 사용하여 지정됩니다. 쿠키 이름은 .입니다 WscContext. 쿠키의 값은 헤더의 Base64 인코딩입니다 wsc:Context . 이 값은 따옴표로 묶습니다.

헤더가 보호되는 WS-Addressing 동일한 이유로 전송 중에 컨텍스트 값을 수정하지 않도록 보호해야 합니다. 헤더는 서비스에서 요청을 디스패치할 위치를 결정하는 데 사용됩니다. 따라서 바인딩이 메시지 보호 기능을 제공하는 경우 헤더는 wsc:Context SOAP 또는 전송 수준에서 디지털 서명 또는 서명 및 암호화되어야 합니다. HTTP 쿠키를 사용하여 컨텍스트를 전파하는 경우 전송 보안을 사용하여 보호해야 합니다.

컨텍스트 교환 프로토콜에 대한 지원이 필요한 서비스 엔드포인트는 게시된 정책에서 명시적으로 만들 수 있습니다. 클라이언트가 SOAP 수준에서 컨텍스트 교환 프로토콜을 지원하거나 HTTP 쿠키 지원을 사용하도록 설정하기 위한 요구 사항을 나타내기 위해 두 가지 새로운 정책 어설션이 도입되었습니다. 서비스의 정책에 대한 이러한 어설션의 생성은 다음과 같이 ContextExchangeMechanism 속성 값에 의해 제어됩니다.

  • 의 경우 ContextSoapHeader다음 어설션이 생성됩니다.

    <IncludeContext
    xmlns="http://schemas.microsoft.com/ws/2006/05/context"  
    protectionLevel="Sign" />  
    
  • 의 경우 HttpCookie다음 어설션이 생성됩니다.

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

참고하십시오