カスタム アクティビティを構築しています。最初のアクティビティには、ReceiveSendReply アクティビティと他のアクティビティが含まれています。このアクティビティでは、ワークフロー インスタンスを作成しています。Intialized CorrelationHandle を OutArgument に割り当てたいと考えています。外部共有変数に割り当てられます。
別のアクティビティには、上記のアクティビティによって作成されたインスタンスを再開する別の ReceiveSendReply アクティビティがあります。2 番目のアクティビティでは、CorrelationHandle を InArgument として使用しています。この InArgument に外部の共有 correlationHandle 変数を割り当てます。
このワークフロー サービスを実行すると、最初の操作は問題なく実行され、相関キーが入力され、応答でその相関キーを受け取ります。受信した相関キーを使用して 2 番目のアクティビティを実行すると、次の例外が返されます。
「インスタンス キー '45f99690-2829-3126-0782-99033212633c' がインスタンスに関連付けられていなかったため、InstancePersistenceCommand の実行が中断されました。これは、インスタンスまたはキーがクリーンアップされたか、キーが無効であるために発生する可能性があります。キーが生成されたメッセージが間違った時間に送信された場合、または誤った相関データが含まれていた場合、キーが無効である可能性があります。」
OutArgument と InArguments を使用して、2 つのカスタム アクティビティ間で 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))
}
},
}
},
}
};
}
}