Вот обновленная версия CacheMetadata, которая сохраняет входной аргумент в переменной, использует его в ответе и устанавливает CorrelationHandle. Основной трюк состоит в том, чтобы добавить их как переменную с помощью AddImplementationVariable, поскольку действия добавляются с использованием AddImplementationChild.
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
_receive = _receive ?? new Receive();
_sendReply = _sendReply ?? new SendReply();
_receive.CanCreateInstance = true;
metadata.AddImplementationChild(_receive);
metadata.AddImplementationChild(_sendReply);
_receive.ServiceContractName = ServiceContractName;
_receive.OperationName = OperationName;
var correlationHandle = new Variable<CorrelationHandle>("correlationHandle");
metadata.AddImplementationVariable(correlationHandle);
var correlationInitializer = new RequestReplyCorrelationInitializer()
{
CorrelationHandle = new InArgument<CorrelationHandle>(correlationHandle)
};
_receive.CorrelationInitializers.Add(correlationInitializer);
var firstName = new Variable<string>("firstName");
metadata.AddImplementationVariable(firstName);
var args = new ReceiveParametersContent();
args.Parameters["firstName"] = new OutArgument<string>(firstName);
_receive.Content = args;
_sendReply.Request = _receive;
var results = new SendParametersContent();
results.Parameters["greeting"] = new InArgument<string>(new VisualBasicValue<string>("\"Hello \" & firstName"));
_sendReply.Content = results;
base.CacheMetadata(metadata);
}