다음을 통해 공유


지원되는 메시지 교환 시나리오

워크플로 서비스는 WCF(Windows Communication Foundation)에 정의된 메시지 교환 시나리오 중 일부를 지원합니다. 지원되는 두 가지 시나리오는 단방향 보내기와 요청/응답입니다. 단방향 보내기 시나리오에서 클라이언트는 워크플로 서비스에 대한 작업을 호출할 때 응답을 예상하지 않습니다. 클라이언트는 작업을 호출하고 실행의 나머지 부분을 진행하기만 합니다. 요청/응답 시나리오에서 클라이언트는 워크플로에서의 응답을 예상하고 응답을 받을 때까지 주 실행 스레드를 차단합니다. 이러한 시나리오에서 알 수 있듯이 클라이언트는 워크플로 서비스와의 모든 메시지 교환을 시작합니다.

이중 통신은 두 가지 방법으로 수행할 수 있습니다. 첫 번째 방법은 일반 WCF 서비스와 같은 이중 계약을 사용하여 비동기 통신에 사용할 세션 ID를 설정하는 것입니다. 하지만 세션 ID가 이중 채널에 직접 연결되어 있기 때문에 채널이 제거될 때마다 클라이언트와 서비스 간의 컨텍스트를 설정하는 수단으로 세션 ID를 사용하는 것은 더 이상 가능하지 않습니다. 이중 통신을 설정하는 두 번째 방법은 독립적인 채널을 통해 통신하는 상호 연결된 계약을 사용하는 것입니다. 이러한 계약은 초기 작업 호출에서 컨텍스트 ID 정보를 전달하며 다른 워크플로 서비스와 마찬가지로 작업 상태가 유지될 수 있습니다. 컨텍스트 ID는 상호 연결된 단방향 계약을 사용하여 응용 프로그램 계층에서 저장되므로 클라이언트나 서비스가 다시 시작된 경우 마지막으로 유지된 상태에서 다시 시작될 수 있습니다. 이는 워크플로 서비스의 이중 통신에 선호되는 방법입니다.

최선의 방법으로, 비동기 통신에 참여하기 전에 서비스와 동기 요청/응답 작업을 한 차례 수행해야 합니다. 이 교환을 통해 클라이언트와 서비스는 이후 작업 호출에서 사용할 수 있는 컨텍스트를 설정할 수 있습니다.

컨텍스트 교환

이 단원에서는 워크플로와 영속 서비스에서 컨텍스트를 사용하여 서비스와 클라이언트 간의 메시지를 상호 연결하는 방법에 대해 설명합니다. 초기 요청/응답 작업 후 클라이언트는 서비스에서 컨텍스트를 받고 해당 메시지 교환의 수명 중에 서비스에 보내는 모든 이후 메시지에서 동일한 컨텍스트를 제공합니다. 컨텍스트는 클라이언트에 불투명하며 지정된 서비스 인스턴스와 설정된 메시지 교환을 통해 통신을 유지하기 위해서만 제공됩니다. 컨텍스트는 설정된 후 서비스에서 들어오는 메시지에 의해서만 수정될 수 있습니다.

참고

이중 시나리오의 경우 서비스에서 컨텍스트를 컨텍스트 헤더로 클라이언트에 보냅니다. 컨텍스트는 서비스에서 클라이언트로 보내는 첫 번째 메시지의 일부이며 클라이언트에서 보낸 첫 번째 요청에 대한 응답이 아닐 수도 있습니다.

서비스 측에서 채널 인스턴스는 들어오는 메시지의 SOAP 헤더 형태로 클라이언트에서 제공한 컨텍스트를 ContextMessageProperty 형식으로 변환하는 일을 담당합니다. ContextMessageProperty는 응용 프로그램 계층이나 스택 위쪽의 채널에서 사용될 수 있습니다. 또한 서비스 측 채널은 응용 프로그램 계층에서 클라이언트에 전파될 새 컨텍스트 값을 지정할 수 있도록 합니다.

이 컨텍스트를 응용 프로그램 계층에서 유지 관리함으로써 원래 채널이 분리되고 새 채널이 설정될 수 있습니다. 컨텍스트 교환 메커니즘이 채널에서 제공되지만 실제 컨텍스트는 클라이언트와 서비스 모두의 응용 프로그램 계층에서 제공되고 복구될 수 있습니다.

서비스 끝점에서 HTTP 전송을 사용하고 클라이언트에서 HTTP 쿠키를 사용할 수 있도록 동의하는 경우 HttpCookie 메커니즘을 사용하여 응용 프로그램 컨텍스트를 교환할 수 있습니다. 클라이언트 채널에서는 컨텍스트 교환 프로토콜을 사용하여 서비스에서 제공되는 컨텍스트를 수락하고 이후의 모든 요청에서 해당 컨텍스트를 적용하여 동일한 클라이언트 채널 인스턴스를 통해 전송되는 요청을 서비스에서 받을 수 있도록 합니다. 컨텍스트 교환 프로토콜은 전송 계층에서 HTTP 쿠키로 제공되는 기능과 동일한 SOAP 기반 기능도 제공합니다.

참고

워크플로 기반이고 SendActivity 활동을 사용하여 영속 서비스나 워크플로 서비스와 통신하는 클라이언트는 ContextBindingElement가 포함된 바인딩을 사용하여 클라이언트와 서비스 간에 컨텍스트를 교환하거나 ContextMessageProperty와 통합되는 다른 상관 관계 채널을 제공해야 합니다.

SOAP 헤더는 컨텍스트 정보를 나타내는 데 사용되는 wsc:Context SOAP 헤더입니다. 컨텍스트 헤더 스키마는 각각 문자열 내용이 포함된 임의의 수의 자식 요소를 허용합니다. 이에 따라 컨텍스트를 나타내는 해당 메시지 속성이 정규화된 XML 이름(wsc:Context 헤더에 있는 자식 요소 이름 및 네임스페이스)을 문자열 값(wsc:Context 헤더에 있는 자식 요소의 텍스트 값)으로 매핑하는 간편한 사전을 사용할 수 있습니다. 따라서 wsc:Context 헤더는 바인딩이 메시지 보호 기능을 제공하는 경우 SOAP 또는 전송 수준에서 디지털 서명되어야 합니다.

컨텍스트 가져오기 및 설정

이전 단원에서 설명한 ContextMessageProperty는 클라이언트 측이나 서비스 측에서 응용 프로그램 계층과 채널 계층 간에 컨텍스트를 전달하는 데 사용되는 메시지 속성입니다. 컨텍스트가 채널 계층에서 설정되면 컨텍스트 채널에 의해 클라이언트와 서비스의 모든 들어오는 메시지에 이 속성이 연결됩니다. 컨텍스트가 응용 프로그램 계층에서 클라이언트나 서비스의 보내는 메시지에 연결되면 채널 계층에 저장된 컨텍스트가 ContextMessageProperty가 나타내는 컨텍스트로 대체됩니다.

클라이언트 또는 서비스 측에서 사용될 수 있는 ContextMessageProperty 외에도 클라이언트 측에서 다음 예제와 같이 IContextManager를 사용하여 현재 컨텍스트를 가져오거나 채널 인스턴스에서 새 컨텍스트를 설정할 수 있습니다.

IDictionary<XmlQualifiedName, string> context;
IContextManager cm = ClientProxy.InnerChannel.GetProperty<IContextManager>();
if (cm != null)
    context = cm.GetContext();
IContextManager cm = ClientProxy.InnerChannel.GetProperty<IContextManager>();
if (cm != null)
    context = cm.SetContext();

참고

ClientProxy 개체는 서비스에서 작업 호출을 하기 위해 svcutil에 의해 생성되는 프록시 클래스 인스턴스의 예입니다.

참고 항목

개념

워크플로 서비스 제작 스타일

기타 리소스

워크플로 서비스 및 영속 서비스 만들기

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.