다음을 통해 공유


메시징 활동

메시징 활동을 사용하면 워크플로가 WCF 메시지를 보내고 받을 수 있습니다. 워크플로에 메시징 활동을 추가하면 임의로 복잡한 MEP(메시지 교환 패턴)를 모델링할 수 있습니다.

메시지 교환 패턴

다음과 같은 세 가지 기본 메시지 교환 패턴이 있습니다.

  • 데이터그램 - 데이터그램 MEP를 사용하는 경우 클라이언트는 서비스에 메시지를 보내지만 서비스는 응답하지 않습니다. 이를 "발사하고 잊어버리기"라고도 합니다. 일단 발사 후 잊어버리는 거래는 성공적인 전달을 확인하는 외부 방식이 필요한 것입니다. 전송 중에 메시지가 손실되어 서비스에 도달하지 못할 수 있습니다. 클라이언트가 메시지를 성공적으로 보내는 경우 서비스에서 메시지를 수신했다고 보장하지는 않습니다. 데이터그램은 자체 MEP를 구축할 수 있는 기반으로서, 메시징의 기본 구성 요소입니다.

  • 요청-응답 - 요청-응답 MEP를 사용하는 경우 클라이언트는 서비스에 메시지를 보내고, 서비스는 필요한 처리를 수행하고 클라이언트에 응답을 다시 보냅니다. 패턴은 요청-응답 쌍으로 구성됩니다. 요청-응답 호출의 예로는 RPC(원격 프로시저 호출) 및 브라우저 GET 요청이 있습니다. 이 패턴을 반이중이라고도합니다.

  • 이중 - 이중 MEP를 사용하는 경우 클라이언트와 서비스는 순서에 따라 서로 메시지를 보낼 수 있습니다. 이중 MEP는 전화 대화와 같으며, 여기서 말하는 각 단어는 메시지입니다.

메시징 활동을 사용하면 이러한 기본 MEP뿐만 아니라 복잡성을 자유롭게 구현할 수 있는 MEP도 구현할 수 있습니다.

메시징 활동

.NET Framework 4.6.1은 다음 메시징 활동을 정의합니다.

  • Send- Send 활동을 이용해 메시지를 보냅니다.

  • SendReply - 활동을 사용하여 SendReply 수신된 메시지에 응답을 보냅니다. 이 활동은 요청/회신 MEP를 구현할 때 워크플로 서비스에서 사용됩니다.

  • Receive- Receive 활동으로 메시지를 받습니다.

  • ReceiveReply - ReceiveReply 활동을 사용해 회신 메시지를 받습니다. 이 활동은 요청/회신 MEP를 구현할 때 워크플로 서비스 클라이언트에서 사용됩니다.

메시징 활동 및 메시지 교환 패턴

데이터그램 MEP에는 메시지를 보내는 클라이언트와 메시지를 받는 서비스가 포함됩니다. 클라이언트가 워크플로인 경우 활동을 사용하여 Send 메시지를 보냅니다. 워크플로에서 해당 메시지를 받으려면 활동을 사용합니다 Receive . Send 활동과 Receive 활동 각각에 Content라는 이름의 속성이 있습니다. 이 속성에는 전송되거나 수신되는 데이터가 포함됩니다. 요청-응답 MEP를 구현할 때 클라이언트와 서비스는 둘 다 활동 쌍을 사용합니다. 클라이언트는 활동을 사용하여 Send 메시지와 ReceiveReply 활동을 보내 서비스에서 응답을 받습니다. 이러한 두 활동은 속성에 의해 Request 서로 연결됩니다. 이 속성은 원래 메시지를 보낸 활동으로 설정 Send 됩니다. 서비스는 ReceiveSendReply로 연결된 활동 쌍을 사용합니다. 이러한 두 활동은 속성에 의해 Request 연결됩니다. 이 속성은 원래 메시지를 받은 Receive 활동으로 설정됩니다. 활동인 ReceiveReplySendReplySendReceive와 같이 Message 인스턴스 또는 메시지 계약 유형을 보낼 수 있게 해줍니다.

워크플로의 장기 실행 특성으로 인해 통신의 이중 패턴도 장기 실행 대화를 지원하는 것이 중요합니다. 장기 실행 대화를 지원하려면 대화를 시작하는 클라이언트가 나중에 데이터를 사용할 수 있게 되면 서비스를 다시 호출할 수 있는 기회를 제공해야 합니다. 예를 들어 관리자 승인을 위해 구매 주문 요청이 제출되지만 하루, 일주일 또는 1년 동안 처리되지 않을 수 있습니다. 구매 주문 승인을 관리하는 워크플로는 승인이 지정된 후 다시 시작해야 합니다. 이 이중 통신 패턴은 상관 관계를 사용하는 워크플로에서 지원됩니다. 이중 패턴을 구현하려면 SendReceive 활동을 사용합니다. 작업에서 Receive을(를) 사용하여 CorrelationHandle 상관 관계를 초기화합니다. Send 작업 집합에서 해당 상관 관계 핸들을 CorrelatesWith 속성 값으로 설정하십시오. 자세한 내용은 Durable Duplex를 참조하세요.

비고

콜백 상관 관계("Durable Duplex")를 활용한 워크플로의 중복 구현은 장기 실행 대화를 염두에 둔 것입니다. 이것은 콜백 계약을 사용하는 WCF 이중과 다릅니다. 여기서 대화는 채널의 수명을 가진 짧은 과정입니다.

메시지 서식 및 메시징 활동

ReceiveReceiveReply 활동에는 Content라는 속성이 있습니다. 이 속성은 ReceiveContent 형식이며 Receive 또는 ReceiveReply 활동이 수신하는 데이터를 나타냅니다. .NET Framework는 ReceiveMessageContentReceiveParametersContent이라는 두 개의 관련된 클래스를 정의하며, 이 두 클래스 모두가 ReceiveContent에서 파생됩니다. 워크플로 서비스로 데이터를 수신하려면 Receive 또는 ReceiveReply 활동의 Content 속성을 이러한 유형 중 하나의 인스턴스로 설정합니다. 사용할 형식은 활동이 수신하는 데이터 형식에 따라 달라집니다. 활동이 Message 객체 또는 메시지 계약 유형을 수신하는 경우 ReceiveMessageContent를 사용합니다. 작업이 직렬화 가능한 데이터 계약 또는 XML 형식 집합을 받을 경우 ReceiveParametersContent를 사용하십시오. ReceiveParametersContent 를 사용하면 여러 매개 변수를 보낼 수 있지만 ReceiveMessageContent 하나의 개체, 메시지(또는 메시지 계약 유형)만 보낼 수 있습니다.

비고

ReceiveMessageContent 는 직렬화할 수 있는 단일 데이터 계약 또는 XML 형식과 함께 사용할 수도 있습니다. 단일 매개 변수를 사용하여 사용하는 ReceiveParametersContent 것과 직접 ReceiveMessageContent 전달된 개체의 차이점은 와이어 형식입니다. 매개 변수의 콘텐츠는 작업 이름에 해당하는 XML 요소로 래핑되고 직렬화된 객체는 매개 변수 이름을 사용하여 XML 요소(<Echo><msg>Hello, World</msg></Echo>)로 래핑됩니다. 메시지 내용이 작업 이름으로 래핑되지 않습니다. 대신 직렬화된 개체는 XML 정규화된 형식 이름(예 <string>Hello, World</string>: )을 사용하여 XML 요소 내에 배치됩니다.

SendSendReply 활동에는 Content이라는 속성도 있습니다. 이 속성은 형식 SendContent 이며 데이터는 Send 활동 또는 SendReply 활동에서 보냅니다. .NET Framework는 SendMessageContent로부터 파생된 두 가지 관련 형식인 SendParametersContentSendContent를 정의합니다. 워크플로 서비스에서 데이터를 보내기 위해 Send 또는 SendReply 활동의 Content 속성을 이러한 형식 중 하나의 인스턴스로 설정하십시오. 사용할 형식은 활동이 보내는 데이터 형식에 따라 달라집니다. 활동에서 Message 개체 또는 메시지 계약 유형을 보내는 경우 SendMessageContent를 사용합니다. 활동이 SendParametersContent 데이터 계약 유형을 전달하는 경우. SendParametersContent 를 사용하면 여러 매개 변수를 보낼 수 있지만 SendMessageContent 하나의 개체, 메시지(또는 메시지 계약 유형)만 보낼 수 있습니다.

메시징 활동을 사용하여 명령적으로 프로그래밍할 때, InArgument<T>, OutArgument<T>, Send, 및 SendReply 활동의 메시지 또는 매개변수 속성에 할당할 개체들을 래핑하기 위해 제네릭 ReceiveReceiveReply을 사용합니다. InArgument<T>Send 활동과 SendReply 활동에 사용하고, OutArgument<T>Receive 활동에 사용합니다. In 인수는 데이터가 활동으로 전달되기 때문에 보내기 활동과 함께 사용됩니다. Out 인수는 다음 예제와 같이 데이터가 활동에서 전달되기 때문에 수신 활동과 함께 사용됩니다.

Receive reserveSeat = new Receive
{
    ...
    Content = new ReceiveParametersContent
    {
        Parameters =
        {
            { "ReservationInfo", new OutArgument<ReservationRequest>(reservationInfo) }
        }
    }
};
SendReply reserveSeat = new SendReply
{
    ...
    Request = reserveSeat,
    Content = new SendParametersContent
    {
        Parameters =
        {
            { "ReservationId", new InArgument<string>(reservationId) }
        }
    },
};

void를 반환하는 요청/응답 작업을 정의하는 워크플로 서비스를 구현하는 경우 다음 예제와 같이 활동을 인스턴스화 SendReply 하고 해당 속성을 콘텐츠 형식Content(또는SendMessageContent) 중 하나의 빈 인스턴스로 설정 SendParametersContent 해야 합니다.

Receive rcv = new Receive()
{
ServiceContractName = "IService",
OperationName = "NullReturningContract",
Content = new ReceiveParametersContent( new Dictionary<string, OutArgument>() { { "message", new OutArgument<string>() } } )
};
SendReply sr = new SendReply()
{
Request = rcv
   Content = new SendParametersContent();
};

서비스 참조 추가

워크플로 애플리케이션에서 워크플로 서비스를 호출할 때 Visual Studio 2012는 요청/회신 MEP에 사용되는 일반적인 Send 활동과 ReceiveReply 활동을 캡슐화하는 사용자 지정 메시징 활동을 생성합니다. 이 기능을 사용하려면 Visual Studio에서 클라이언트 프로젝트를 마우스 오른쪽 단추로 클릭하고서비스 참조>를 선택합니다. 주소 상자에 서비스의 기본 주소를 입력하고 이동을 클릭합니다. 사용 가능한 서비스가 서비스 : 상자에 표시됩니다. 서비스 노드를 확장하여 지원되는 계약을 표시합니다. 호출하려는 계약을 선택하면 사용 가능한 작업 목록이 작업 상자에 표시됩니다. 그런 다음 생성된 활동의 네임스페이스를 지정하고 확인을 클릭할 수 있습니다. 그런 다음 작업이 성공적으로 완료되었으며 프로젝트를 다시 빌드한 후 생성된 사용자 지정 활동이 도구 상자에 있음을 나타내는 대화 상자가 표시됩니다. 서비스 계약에 정의된 각 작업에 대해 하나의 작업이 있습니다. 프로젝트를 다시 빌드한 후 사용자 지정 활동을 워크플로로 끌어서 놓고 속성 창에서 필요한 속성을 설정할 수 있습니다.

메시징 활동 템플릿

클라이언트 및 서비스에서 요청/응답 MEP를 더 쉽게 설정하기 위해 Visual Studio 2012는 두 가지 메시징 활동 템플릿을 제공합니다. System.ServiceModel.Activities.Design.ReceiveAndSendReply 는 서비스에서 사용되며 System.ServiceModel.Activities.Design.SendAndReceiveReply 클라이언트에서 사용됩니다. 두 경우 모두 템플릿은 워크플로에 적절한 메시징 활동을 추가합니다. 서비스에서 System.ServiceModel.Activities.Design.ReceiveAndSendReply 활동을 추가한 다음, Receive 활동이 이어지고 SendReply 활동을 추가합니다. Request 속성이 자동으로 Receive 활동에 설정됩니다. 클라이언트의 System.ServiceModel.Activities.Design.SendAndReceiveReply에서 Send 활동이 추가된 후 ReceiveReply이 추가됩니다. Request 속성이 자동으로 Send 활동에 설정됩니다. 이러한 템플릿을 사용하려면 적절한 템플릿을 워크플로에 끌어서 놓기만 하면 됩니다.

메시징 활동 및 트랜잭션

워크플로 서비스에 대한 호출이 수행되면 트랜잭션을 서비스 작업으로 흐를 수 있습니다. 이렇게 하려면 Receive 활동을 TransactedReceiveScope 활동 내에 배치하십시오. TransactedReceiveScope 활동은 Receive 활동과 본문을 포함합니다. 서비스로 전달된 트랜잭션은 본문을 TransactedReceiveScope실행하는 동안 앰비언트 상태로 유지됩니다. 본문 실행이 완료되면 트랜잭션이 완료됩니다. 워크플로 및 트랜잭션에 대한 자세한 내용은 워크플로 트랜잭션을 참조하세요.

참고하십시오