첫 번째 활동에는 다른 활동과 함께 ReceiveSendReply 활동이 포함되어 있습니다. 이 액티비티에서는 워크 플로우 인스턴스를 생성합니다. 나는 OutArgument에 Intialized CorrelationHandle을 할당하려고합니다. 어떤 것이 외부 공유 varriable에 할당 될 것입니다.인수를 사용하여 두 개의 사용자 지정 활동간에 CorrelationHandle 공유
다른 활동에서 위의 활동으로 작성된 인스턴스를 다시 시작하는 또 다른 ReceiveSendReply 활동이 있습니다. 두 번째 활동에서 CorrelationHandle을 InArgument로 사용합니다. 나는이 InArgument에 외부의 공유 correlationHandle varriable을 할당 할 것이다.
이 워크 플로 서비스를 실행할 때 첫 번째 작업은 아무 문제없이 실행되고 상관 관계 키가 채워지고 응답에서 해당 상관 관계 키가 나타납니다. 받은 상관 관계 키를 사용하여 두 번째 작업을 실행하는 경우 다음 예외가있는 서비스가 반환됩니다.
"인스턴스 키 '45f99690-2829-3126-0782-99033212633c'이 연결되지 않아 InstancePersistenceCommand 실행이 중단되었습니다. 인스턴스 또는 키가 정리되었거나 키가 유효하지 않기 때문에 발생할 수 있습니다. 생성 된 메시지가 잘못된 시간에 보내 졌거나 잘못된 상관 관계 데이터가 포함 된 경우 키가 유효하지 않을 수 있습니다.
OutArgument 및 InArguments를 사용하여 두 개의 사용자 지정 작업간에 CorrelationHandle을 공유하는 방법을 알고 싶습니다.
public sealed class Create : Activity
{
public Create()
{
Implementation = new Func<Activity>(CreateBody);
}
public string ServiceContract { get; set; }
public string Operation { get; set; }
[RequiredArgument]
public OutArgument<CorrelationHandle> CorrelationHandle { get; set; }
Activity CreateBody()
{
// variables declaration.
var requestContent = new Variable<string>();
var operationResponseParam = new Variable<OperationResponseParam>();
var correlationKey = new Variable<string>();
var correlationHandle = new Variable<CorrelationHandle>();
Receive receiveRequest;
return new Sequence
{
Variables = { correlationHandle, correlationKey },
Activities =
{
{receiveRequest = new Receive()
{
ServiceContractName = ServiceContract,
OperationName = Operation,
CanCreateInstance = true,
Content = new ReceiveMessageContent
{
Message = new OutArgument<string>(ctx => operationRequestParam.Get(ctx))
},
}},
new Assign<string>
{
To = new OutArgument<string>(ctx => correlationKey.Get(ctx)),
Value = new InArgument<string>(ctx => Guid.NewGuid().ToString())
},
new Assign<ApplicationDataList>
{
To = new ArgumentReference<ApplicationDataList>("AppData"),
Value = new InArgument<ApplicationDataList>(ctx =>appData.Get(ctx))
},
new Assign<OperationResponseParam>
{
To = new OutArgument<OperationResponseParam>(ctx => operationResponseParam.Get(ctx)),
Value = new InArgument<OperationResponseParam>
{
Expression = new BuildResponse()
{
CorrelationKey = new InArgument<string>(correlationKey),
}
}
},
new SendReply
{
Request = receiveRequest,
Content = new SendMessageContent
{
Message = new InArgument<OperationResponseParam>(ctx => operationResponseParam.Get(ctx))
},
CorrelationInitializers =
{
new QueryCorrelationInitializer
{
CorrelationHandle = new InArgument<CorrelationHandle>(correlationHandle),
MessageQuerySet = new MessageQuerySet
{
{
"CorrelationKey", new XPathMessageQuery("sm:header()/tempuri:CorrelationKey")
}
}
}
}
},
new Assign<CorrelationHandle>
{
To = new ArgumentReference<CorrelationHandle>("CorrelationHandle"),
Value = new InArgument<CorrelationHandle>(ctx =>correlationHandle.Get(ctx))
},
}
};
}
}
public sealed class Wait : Activity
{
public Wait()
{
Implementation = new Func<Activity>(CreateBody);
}
public string ServiceContract { get; set; }
public string Operation { get; set; }
[RequiredArgument]
public InArgument<CorrelationHandle> CorrelationHandle { get; set; }
Activity CreateBody()
{
// variables declaration.
var operationRequestParam = new Variable<OperationRequestParam>();
var operationResponseParam = new Variable<OperationResponseParam>();
var correlationHandle = new Variable<CorrelationHandle>();
Receive receiveRequest;
return new Sequence
{
Variables = { correlationHandle },
Activities =
{
new Sequence
{
Variables = {operationRequestParam, operationResponseParam },
Activities =
{
{receiveRequest =new Receive()
{
ServiceContractName = ServiceContract,
OperationName = Operation,
CanCreateInstance = false,
CorrelatesWith = new InArgument<CorrelationHandle>(ctx => CorrelationHandle.Get(ctx)),
CorrelatesOn = new MessageQuerySet
{
{ "CorrelationKey", new XPathMessageQuery("sm:header()/tempuri:CorrelationKey")}
},
//parameters for receive
Content = new ReceiveMessageContent
{
Message = new OutArgument<OperationRequestParam>(ctx => operationRequestParam.Get(ctx))
},
}},
new Assign<OperationResponseParam>
{
To = new OutArgument<OperationResponseParam>(operationResponseParam),
Value = new InArgument<OperationResponseParam>
{
Expression = new BuildResponse()
{
ApplicationData = new InArgument<ApplicationDataList>(ctx => appData.Get(ctx)),
}
}
},
new SendReply
{
Request = receiveRequest,
Content = new SendMessageContent
{
Message = new InArgument<OperationResponseParam>(ctx => operationResponseParam.Get(ctx))
}
},
}
},
}
};
}
}
커스텀 ReceiveSendReply 활동을 구현해야합니까? 왜 당신은 WF와 함께 제공되는 것들을 사용하고, 필요한 로직을 실행하기위한 좀 더 간단한 액티비티를 만들고, ReceiveSendReply 빌트인 액티비티의 일반적인 상관 옵션과 상호 연관시켜 보시지 않겠습니까? –