private void OnBodyCompleted(NativeActivityContext context, System.Activities.ActivityInstance completedInstance)
        {
            TransactedReceiveData data = context.Properties.Find(TransactedReceiveData.TransactedReceiveDataExecutionPropertyName) as TransactedReceiveData;

            if (!this.isNested.Get(context))
            {
                CommittableTransaction initiatingTransaction = data.InitiatingTransaction as CommittableTransaction;
                if (initiatingTransaction != null)
                {
                    initiatingTransaction.BeginCommit(TransactionCommitAsyncCallback, initiatingTransaction);
                }
                else
                {
                    (data.InitiatingTransaction as DependentTransaction).Complete();
                }
            }
            else
            {
                DependentTransaction transaction3 = data.InitiatingTransaction as DependentTransaction;
                if (transaction3 != null)
                {
                    transaction3.Complete();
                }
            }
        }
Пример #2
0
        void OnBodyCompleted(NativeActivityContext context, ActivityInstance completedInstance)
        {
            TransactedReceiveData transactedReceiveData = context.Properties.Find(TransactedReceiveData.TransactedReceiveDataExecutionPropertyName) as TransactedReceiveData;

            Fx.Assert(transactedReceiveData != null, "TransactedReceiveScope.OnBodyComplete - transactedreceivedata is null");

            //Non Nested
            if (!this.isNested.Get(context))
            {
                Fx.Assert(transactedReceiveData.InitiatingTransaction != null, "TransactedReceiveScope.OnBodyComplete - Initiating transaction is null");
                System.Transactions.CommittableTransaction committableTransaction = transactedReceiveData.InitiatingTransaction as System.Transactions.CommittableTransaction;
                //If the initiating transaction was a committable transaction => this is a server side only transaction. Commit it here instead of letting the dispatcher deal with it
                //since we are Auto Complete = false and we want the completion of the TransactedReceiveScope to initiate the Commit.
                if (committableTransaction != null)
                {
                    committableTransaction.BeginCommit(TransactionCommitAsyncCallback, committableTransaction);
                }
                else
                {
                    //If the initiating transaction was a dependent transaction instead => this is a flowed in transaction, let's just complete the dependent clone
                    System.Transactions.DependentTransaction dependentTransaction = transactedReceiveData.InitiatingTransaction as System.Transactions.DependentTransaction;
                    Fx.Assert(dependentTransaction != null, "TransactedReceiveScope.OnBodyComplete - DependentClone was null");
                    dependentTransaction.Complete();
                }
            }
            else //Nested scenario - e.g TRS inside a TSA and in a flow case :- we still need to complete the dependent transaction
            {
                System.Transactions.DependentTransaction dependentTransaction = transactedReceiveData.InitiatingTransaction as System.Transactions.DependentTransaction;
                if (dependentTransaction != null)
                {
                    dependentTransaction.Complete();
                }
            }
        }
        private void SetupTransaction(NativeActivityContext executionContext, ReceiveMessageInstanceData instance)
        {
            WorkflowOperationContext workflowOperationContext = instance.CorrelationResponseContext.WorkflowOperationContext;

            if (workflowOperationContext.CurrentTransaction != null)
            {
                RuntimeTransactionHandle handle = null;
                handle = executionContext.Properties.Find(runtimeTransactionHandlePropertyName) as RuntimeTransactionHandle;
                if (handle == null)
                {
                    throw System.ServiceModel.Activities.FxTrace.Exception.AsError(new InvalidOperationException(System.ServiceModel.Activities.SR.ReceiveNotWithinATransactedReceiveScope));
                }
                TransactedReceiveData data = executionContext.Properties.Find(TransactedReceiveData.TransactedReceiveDataExecutionPropertyName) as TransactedReceiveData;
                if ((data != null) && this.AdditionalData.IsFirstReceiveOfTransactedReceiveScopeTree)
                {
                    data.InitiatingTransaction = workflowOperationContext.OperationContext.TransactionFacet.Current;
                }
                Transaction currentTransaction = handle.GetCurrentTransaction(executionContext);
                if (currentTransaction != null)
                {
                    if (!currentTransaction.Equals(workflowOperationContext.CurrentTransaction))
                    {
                        throw System.ServiceModel.Activities.FxTrace.Exception.AsError(new InvalidOperationException(System.ServiceModel.Activities.SR.FlowedTransactionDifferentFromAmbient));
                    }
                    this.ServerScheduleOnReceivedMessage(executionContext, instance);
                }
                else
                {
                    ReceiveMessageState state = new ReceiveMessageState {
                        CurrentTransaction = workflowOperationContext.CurrentTransaction.Clone(),
                        Instance           = instance
                    };
                    handle.RequireTransactionContext(executionContext, new Action <NativeActivityTransactionContext, object>(this.RequireContextCallback), state);
                }
            }
            else
            {
                this.ServerScheduleOnReceivedMessage(executionContext, instance);
            }
        }