Как получить OutArgument из запланированной активности внутри нативной активности? - PullRequest
1 голос
/ 03 марта 2011

У меня есть действие, которое состоит из действия получения и действия SendReply.Операция приема ожидает сообщения, затем записывает его на консоль и затем отправляет ответ.

Проблема заключается в том, что я не могу получить сообщение из операции получения после его завершения.

Ниже приведен мой класс активности и информация об исключениях.

public sealed class MyActivity : NativeActivity
{
    private Receive Receive { get; set; }
    private SendReply SendReply { get; set; }

    private Variable<CorrelationHandle> CorrelationHandle { get; set; }
    private Variable<string> MessageParameter { get; set; }
    private Variable<string> ResponseParameter { get; set; }

    public MyActivity()
    {   
        CorrelationHandle = new Variable<CorrelationHandle>("SenseProcessCorrelationHandle");
        MessageParameter = new Variable<string>("MessageParamter");
        ResponseParameter = new Variable<string>("ResponseParam");

        Receive = new Receive
        {
            ServiceContractName = XName.Get("{http://tempuri.org/}MyService" ),
            OperationName = "Trigger",
            Content = new ReceiveParametersContent
            {
                Parameters =
                {
                    { "Message", new OutArgument<string>(MessageParameter) },
                },
            },
            CanCreateInstance = true, 
            CorrelationInitializers =
            {
                new RequestReplyCorrelationInitializer
                {
                    CorrelationHandle = new InArgument<CorrelationHandle>(CorrelationHandle),
                }
            }
        };

        SendReply = new SendReply
        {
            Request = Receive,
            Content = new SendMessageContent
            {
                Message = new InArgument<string>(ResponseParameter),
            }
        };

    }

    protected override void Execute(NativeActivityContext context)
    {
        context.ScheduleActivity(Receive, OnReceiveCompleted);
    }

    void OnReceiveCompleted(NativeActivityContext context, ActivityInstance inst)
    {

        /* Next code line throws exception
         * 
         * Activity '2: MyActivity' cannot access this variable because it is 
         * declared at the scope of activity '2: MyActivity'.  An activity 
         * can only access its own implementation variables.
         */
        Console.WriteLine(MessageParameter.Get(context));             

        context.ScheduleActivity(SendReply);
    }

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        metadata.AddChild(Receive);
        metadata.AddChild(SendReply);
        metadata.AddVariable(CorrelationHandle);
        metadata.AddVariable(ResponseParameter);
        metadata.AddVariable(MessageParameter);            
    }
}

Если кто-то знает, что я делаю неправильно, я был бы признателен за любую помощь.

Спасибо

1 Ответ

1 голос
/ 08 августа 2011

Вы должны ввести этот код вместо вашего кода:

CorrelationInitializers = 
{                 
    new RequestReplyCorrelationInitializer  
    {
        CorrelationHandle = CorrelationHandle 
    }          
}

Какая вторая CorrelationHandle - ваша переменная, а не новый аргумент.

...