Correlatie delenHandvat tussen twee aangepaste activiteiten met behulp van argumenten

Ik bouw aangepaste activiteiten, eerste activiteit bevat ReceiveSendReply-activiteit met een aantal andere activiteiten. In deze activiteit maak ik een workflow-instantie aan. Ik wil een geïnialiseerde correlatielaag toewijzen aan het outargument. Welke wordt toegewezen aan de externe gedeelde variabele.

In een andere activiteit heb ik een andere ReceiveSendReply-activiteit, die de instantie die door de bovengenoemde activiteit is gemaakt, zal hervatten. In de tweede activiteit heb ik CorrelationHandle als InArgument. Ik zal dit InArgument toewijzen aan de externe gedeelde correlatiehandle varriable.

Wanneer ik deze werkstroomservice uitvoer, wordt de eerste bewerking uitgevoerd zonder enig probleem en wordt de correlatiesleutel ingevuld en ontvang ik die correlatiesleutel in het antwoord. Wanneer ik de tweede activiteit met de ontvangen correlatietoets uitvoer, retourneer service met de volgende uitzondering:

"De uitvoering van een ExemplaarPersistenceCommand is onderbroken omdat de instantiesleutel '45f99690-2829-3126-0782-99033212633c' niet aan een exemplaar is gekoppeld. Dit kan gebeuren omdat de instantie of sleutel is opgeschoond of omdat de sleutel ongeldig is. De sleutel kan ongeldig zijn als het bericht waaruit het is gegenereerd, op het verkeerde moment is verzonden of onjuiste correlatiegegevens bevat. "

Ik wil weten hoe ik een CorrelationHandle kan delen tussen twee aangepaste activiteiten door OutArgument en InArguments te gebruiken?

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))
                            }
                        },
                    }
                },
            }
        };
    }
}
0
Moet u echt aangepaste ReceiveSendReply-activiteiten implementeren? Waarom gebruik je niet gewoon degene die bij WF zijn geleverd, maak je eenvoudigere activiteiten om de logica uit te voeren die je nodig hebt, en correleer je met de normale correlatiemogelijkheden van de ingebouwde InSendReply-activiteiten?
toegevoegd de auteur Gabe Thorns, de bron

1 antwoord

We moeten de handle gebruiken als een InArgument en het object dat de handle refeert, zal worden gewijzigd door InitializeCorrelation. Dus in mijn beide activiteiten moet ik InArgument gebruiken in plaats van OutArgument in het eerste en InArgument in het tweede.

public sealed class Create : Activity
{
    public Create()
    {
        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 appData = new Variable();
        var operationResponseParam = new Variable();
        var correlationKey = new Variable();


        Receive receiveRequest;

        return new Sequence
        {
            Variables = { correlationKey }, 
            Activities = 
            {
                {receiveRequest = new Receive()
                {
                    ServiceContractName = ServiceContract,
                    OperationName = Operation,
                    CanCreateInstance = true,
                    //parameters for receive
                    Content = new ReceiveMessageContent
                    {
                        Message = new OutArgument(ctx => operationRequestParam.Get(ctx))
                    },
                }},

               //Assign a unique identifier to the correlation key.
                new Assign
                {
                    To = new OutArgument(ctx => correlationKey.Get(ctx)),
                    Value = new InArgument(ctx => Guid.NewGuid().ToString())
                },

                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(ctx => CorrelationHandle.Get(ctx)),
                            MessageQuerySet = new MessageQuerySet
                            {
                                {
                                    "CorrelationKey", new XPathMessageQuery("sm:header()/tempuri:CorrelationKey")
                                }
                            }
                        }
                    }
                },
            }
        };
    }
}

public sealed class Wait : Activity
{
    static Wait()
    {
        AttributeTableBuilder builder = new AttributeTableBuilder();
        builder.AddCustomAttributes(typeof(Wait), "EscalationData", new EditorAttribute(typeof(EscalationDataEditor), typeof(DialogPropertyValueEditor)));
        MetadataStore.AddAttributeTable(builder.CreateTable());
    }

    public Wait()
    {
        Implementation = new Func(CreateBody);
    }

    public EscalationInfoList EscalationData { get; set; }

    public string ServiceContract { get; set; }

    public string Operation { get; set; }

    [RequiredArgument]
    public InArgument CorrelationHandle { get; set; }

    Activity CreateBody()
    {
       //variables declaration. 
        var appData = new Variable();
        var operationRequestParam = new Variable();
        var operationResponseParam = new Variable();

        Receive receiveRequest;

        return new Sequence
        {
            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 SendReply
                        {
                            Request = receiveRequest,
                            Content = new SendMessageContent
                            {
                                Message = new InArgument(ctx => operationResponseParam.Get(ctx))
                            }
                        },
                    }
                },
            }
        }
    }
}
1
toegevoegd