私はカスタムアクティビティを構築しています。最初のアクティビティにはReceiveSendReplyアクティビティが含まれています。このアクティビティでは、ワークフローインスタンスを作成しています。 OutArgumentにIntialized CorrelationHandleを割り当てたいと思います。どちらが外部共有varriableに割り当てられますか。
別のアクティビティでは、別のReceiveSendReplyアクティビティがあり、上記のアクティビティによって作成されたインスタンスが再開されます。 2番目のアクティビティでは、CorrelationHandleをInArgumentとして持っています。私は、このInArgumentに外部の共有correlationHandle varriableを割り当てます。
このワークフローサービスを実行すると、最初の操作は何の問題もなく実行され、相関キーが入力され、その相関キーが応答として受信されます。受信した相関キーを使用して2番目のアクティビティを実行すると、次の例外を除いてサービスが戻ります。
インスタンス・キー '45f99690-2829-3126-0782-99033212633c'がインスタンスに関連付けられていないため、InstancePersistenceCommandの実行が中断されました。これは、インスタンスまたはキーがクリーン・アップされたか、またはキーが無効であるために発生します。生成されたメッセージが間違った時刻に送信されたか、不正な相関データが含まれていると、キーが無効になる可能性があります。
OutArgumentとInArgumentsを使用して2つのカスタムアクティビティ間でCorrelationHandleを共有する方法を知りたいですか?
public sealed class Create : Activity
{
public Create()
{
Implementation = new Func(CreateBody);
}
public string ServiceContract { get; set; }
public string Operation { get; set; }
[RequiredArgument]
public OutArgument CorrelationHandle { get; set; }
Activity CreateBody()
{
//variables declaration.
var requestContent = new Variable();
var operationResponseParam = new Variable();
var correlationKey = new Variable();
var correlationHandle = new Variable();
Receive receiveRequest;
return new Sequence
{
Variables = { correlationHandle, correlationKey },
Activities =
{
{receiveRequest = new Receive()
{
ServiceContractName = ServiceContract,
OperationName = Operation,
CanCreateInstance = true,
Content = new ReceiveMessageContent
{
Message = new OutArgument(ctx => operationRequestParam.Get(ctx))
},
}},
new Assign
{
To = new OutArgument(ctx => correlationKey.Get(ctx)),
Value = new InArgument(ctx => Guid.NewGuid().ToString())
},
new Assign
{
To = new ArgumentReference("AppData"),
Value = new InArgument(ctx =>appData.Get(ctx))
},
new Assign
{
To = new OutArgument(ctx => operationResponseParam.Get(ctx)),
Value = new InArgument
{
Expression = new BuildResponse()
{
CorrelationKey = new InArgument(correlationKey),
}
}
},
new SendReply
{
Request = receiveRequest,
Content = new SendMessageContent
{
Message = new InArgument(ctx => operationResponseParam.Get(ctx))
},
CorrelationInitializers =
{
new QueryCorrelationInitializer
{
CorrelationHandle = new InArgument(correlationHandle),
MessageQuerySet = new MessageQuerySet
{
{
"CorrelationKey", new XPathMessageQuery("sm:header()/tempuri:CorrelationKey")
}
}
}
}
},
new Assign
{
To = new ArgumentReference("CorrelationHandle"),
Value = new InArgument(ctx =>correlationHandle.Get(ctx))
},
}
};
}
}
public sealed class Wait : Activity
{
public Wait()
{
Implementation = new Func(CreateBody);
}
public string ServiceContract { get; set; }
public string Operation { get; set; }
[RequiredArgument]
public InArgument CorrelationHandle { get; set; }
Activity CreateBody()
{
//variables declaration.
var operationRequestParam = new Variable();
var operationResponseParam = new Variable();
var correlationHandle = new Variable();
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(ctx => CorrelationHandle.Get(ctx)),
CorrelatesOn = new MessageQuerySet
{
{ "CorrelationKey", new XPathMessageQuery("sm:header()/tempuri:CorrelationKey")}
},
//parameters for receive
Content = new ReceiveMessageContent
{
Message = new OutArgument(ctx => operationRequestParam.Get(ctx))
},
}},
new Assign
{
To = new OutArgument(operationResponseParam),
Value = new InArgument
{
Expression = new BuildResponse()
{
ApplicationData = new InArgument(ctx => appData.Get(ctx)),
}
}
},
new SendReply
{
Request = receiveRequest,
Content = new SendMessageContent
{
Message = new InArgument(ctx => operationResponseParam.Get(ctx))
}
},
}
},
}
};
}
}