public CorrelationKeyCalculator GetKeyCalculator()
        {
            if (this.correlationKeyCalculator == null)
            {
                CorrelationKeyCalculator localKeyCalculator = new CorrelationKeyCalculator(this.ScopeName);

                foreach (CorrelationQuery query in this.queries)
                {
                    IDictionary <string, MessageQueryTable <string> > dictionary =
                        new Dictionary <string, MessageQueryTable <string> >();

                    // consider changing Dictionary to Collection
                    int count = 0;
                    foreach (MessageQuerySet querySet in query.SelectAdditional)
                    {
                        dictionary.Add("SelectAdditional_item_" + count, querySet.GetMessageQueryTable());
                        count++;
                    }

                    localKeyCalculator.AddQuery(
                        query.Where,
                        query.Select != null ? query.Select.GetMessageQueryTable() : new MessageQueryTable <string>(),
                        dictionary,
                        query.IsDefaultContextQuery);
                }

                this.correlationKeyCalculator = localKeyCalculator;
            }

            return(this.correlationKeyCalculator);
        }
        public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
        {
            ServiceHostBase serviceHost = dispatchOperation.Parent.ChannelDispatcher.Host;

            if (!(serviceHost is WorkflowServiceHost))
            {
                throw FxTrace.Exception.AsError(
                          new InvalidOperationException(SR.WorkflowBehaviorWithNonWorkflowHost(typeof(ControlOperationBehavior).Name)));
            }

            ServiceEndpoint endpoint = null;

            foreach (ServiceEndpoint endpointToMatch in serviceHost.Description.Endpoints)
            {
                if (endpointToMatch.Id == dispatchOperation.Parent.EndpointDispatcher.Id)
                {
                    endpoint = endpointToMatch;
                    break;
                }
            }

            if (this.isWrappedMode)
            {
                CorrelationKeyCalculator keyCalculator = null;

                if (endpoint != null)
                {
                    CorrelationQueryBehavior endpointQueryBehavior = endpoint.Behaviors.Find <CorrelationQueryBehavior>();

                    if (endpointQueryBehavior != null)
                    {
                        keyCalculator = endpointQueryBehavior.GetKeyCalculator();
                    }
                }

                //This will be the case for infrastructure endpoints like Compensation/Interop OCS endpoints.
                dispatchOperation.Invoker = new ControlOperationInvoker(
                    operationDescription,
                    endpoint,
                    keyCalculator,
                    dispatchOperation.Invoker,
                    serviceHost);
            }
            else
            {
                //This will be for IWorkflowInstanceManagement endpoint operation.
                dispatchOperation.Invoker = new ControlOperationInvoker(
                    operationDescription,
                    endpoint,
                    null,
                    serviceHost);
            }
        }
        public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
        {
            if (operationDescription == null)
            {
                throw FxTrace.Exception.ArgumentNull("operationDescription");
            }
            if (dispatchOperation == null)
            {
                throw FxTrace.Exception.ArgumentNull("dispatchOperation");
            }
            if (dispatchOperation.Parent == null ||
                dispatchOperation.Parent.ChannelDispatcher == null ||
                dispatchOperation.Parent.ChannelDispatcher.Host == null ||
                dispatchOperation.Parent.ChannelDispatcher.Host.Description == null ||
                dispatchOperation.Parent.ChannelDispatcher.Host.Description.Behaviors == null)
            {
                throw FxTrace.Exception.AsError(new InvalidOperationException(SR.DispatchOperationInInvalidState));
            }

            ServiceHostBase serviceHost = dispatchOperation.Parent.ChannelDispatcher.Host;

            if (!(serviceHost is WorkflowServiceHost))
            {
                throw FxTrace.Exception.AsError(
                          new InvalidOperationException(SR.WorkflowBehaviorWithNonWorkflowHost(typeof(WorkflowOperationBehavior).Name)));
            }

            CorrelationKeyCalculator correlationKeyCalculator = null;

            ServiceEndpoint endpoint = null;

            foreach (ServiceEndpoint endpointToMatch in serviceHost.Description.Endpoints)
            {
                if (endpointToMatch.Id == dispatchOperation.Parent.EndpointDispatcher.Id)
                {
                    endpoint = endpointToMatch;
                    break;
                }
            }

            if (endpoint != null)
            {
                CorrelationQueryBehavior queryBehavior = endpoint.Behaviors.Find <CorrelationQueryBehavior>();

                if (queryBehavior != null)
                {
                    correlationKeyCalculator = queryBehavior.GetKeyCalculator();
                }
            }

            dispatchOperation.Invoker = new WorkflowOperationInvoker(operationDescription,
                                                                     endpoint, correlationKeyCalculator, this, serviceHost, dispatchOperation.Invoker);
        }
        public ControlOperationInvoker(OperationDescription description, ServiceEndpoint endpoint,
            CorrelationKeyCalculator correlationKeyCalculator, IOperationInvoker innerInvoker, ServiceHostBase host)
        {
            Fx.Assert(host is WorkflowServiceHost, "ControlOperationInvoker must be used with a WorkflowServiceHost");

            this.host = (WorkflowServiceHost)host;
            this.instanceManager = this.host.DurableInstanceManager;
            this.operationName = description.Name;
            this.isOneWay = description.IsOneWay;
            this.endpoint = endpoint;
            this.innerInvoker = innerInvoker;
            this.keyCalculator = correlationKeyCalculator;
            this.persistTimeout = this.host.PersistTimeout;

            if (description.DeclaringContract == WorkflowControlEndpoint.WorkflowControlServiceContract ||
                description.DeclaringContract == WorkflowControlEndpoint.WorkflowControlServiceBaseContract)
            {
                //Mode1: This invoker belongs to IWorkflowInstanceManagement operation.
                this.isControlOperation = true;
                switch (this.operationName)
                {
                    case XD2.WorkflowInstanceManagementService.Cancel:
                    case XD2.WorkflowInstanceManagementService.TransactedCancel:
                    case XD2.WorkflowInstanceManagementService.Run:
                    case XD2.WorkflowInstanceManagementService.TransactedRun:
                    case XD2.WorkflowInstanceManagementService.Unsuspend:
                    case XD2.WorkflowInstanceManagementService.TransactedUnsuspend:
                        this.inputParameterCount = 1;
                        break;
                    case XD2.WorkflowInstanceManagementService.Abandon:
                    case XD2.WorkflowInstanceManagementService.Suspend:
                    case XD2.WorkflowInstanceManagementService.TransactedSuspend:
                    case XD2.WorkflowInstanceManagementService.Terminate:
                    case XD2.WorkflowInstanceManagementService.TransactedTerminate:
                    case XD2.WorkflowInstanceManagementService.Update:
                    case XD2.WorkflowInstanceManagementService.TransactedUpdate:
                        this.inputParameterCount = 2;
                        break;
                    default:
                        throw Fx.AssertAndThrow("Unreachable code");
                }
            }
            else if (endpoint is WorkflowHostingEndpoint)
            {
                this.CanCreateInstance = true;
            }
            else
            {
                this.bufferedReceiveManager = this.host.Extensions.Find<BufferedReceiveManager>();
            }
        }
 public WorkflowOperationInvoker(OperationDescription operationDescription, ServiceEndpoint endpoint,
                                 CorrelationKeyCalculator keyCalculator, WorkflowOperationBehavior behavior, ServiceHostBase host, IOperationInvoker innerInvoker)
     : base(operationDescription, endpoint, keyCalculator, host)
 {
     Fx.Assert(operationDescription != null, "Null OperationDescription");
     Fx.Assert(behavior != null, "Null WorkflowOperationBehavior");
     this.StaticBookmarkName         = behavior.bookmark == null ? null : behavior.bookmark.Name;
     this.behavior                   = behavior;
     this.CanCreateInstance          = behavior.CanCreateInstance;
     this.performanceCountersEnabled = PerformanceCounters.PerformanceCountersEnabled;
     this.propagateActivity          = TraceUtility.ShouldPropagateActivity;
     this.isHostingEndpoint          = endpoint is WorkflowHostingEndpoint;
     this.innerInvoker               = innerInvoker;
     this.isFirstReceiveOfTransactedReceiveScopeTree = operationDescription.IsFirstReceiveOfTransactedReceiveScopeTree;
 }
示例#6
0
        public static Message InitializeCorrelationHandles(NativeActivityContext context,
                                                           CorrelationHandle selectHandle, CorrelationHandle ambientHandle, Collection <CorrelationInitializer> additionalCorrelations,
                                                           CorrelationKeyCalculator keyCalculator, Message message)
        {
            InstanceKey instanceKey;
            ICollection <InstanceKey> additionalKeys;

            //
            MessageBuffer buffer = message.CreateBufferedCopy(int.MaxValue);

            if (keyCalculator.CalculateKeys(buffer, message, out instanceKey, out additionalKeys))
            {
                InitializeCorrelationHandles(context, selectHandle, ambientHandle, additionalCorrelations, instanceKey, additionalKeys);
            }
            return(buffer.CreateMessage());
        }
        public ControlOperationInvoker(OperationDescription description, ServiceEndpoint endpoint, CorrelationKeyCalculator correlationKeyCalculator, IOperationInvoker innerInvoker, ServiceHostBase host)
        {
            this.host = (WorkflowServiceHost) host;
            this.instanceManager = this.host.DurableInstanceManager;
            this.operationName = description.Name;
            this.isOneWay = description.IsOneWay;
            this.endpoint = endpoint;
            this.innerInvoker = innerInvoker;
            this.keyCalculator = correlationKeyCalculator;
            this.persistTimeout = this.host.PersistTimeout;
            if (description.DeclaringContract == WorkflowControlEndpoint.WorkflowControlServiceContract)
            {
                this.isControlOperation = true;
                switch (this.operationName)
                {
                    case "Cancel":
                    case "TransactedCancel":
                    case "Run":
                    case "TransactedRun":
                    case "Unsuspend":
                    case "TransactedUnsuspend":
                        this.inputParameterCount = 1;
                        return;

                    case "Abandon":
                    case "Suspend":
                    case "TransactedSuspend":
                    case "Terminate":
                    case "TransactedTerminate":
                        this.inputParameterCount = 2;
                        return;
                }
                throw Fx.AssertAndThrow("Unreachable code");
            }
            if (endpoint is WorkflowHostingEndpoint)
            {
                this.CanCreateInstance = true;
            }
            else
            {
                this.bufferedReceiveManager = this.host.Extensions.Find<System.ServiceModel.Activities.Dispatcher.BufferedReceiveManager>();
            }
        }
示例#8
0
 public CorrelationKeyCalculator GetKeyCalculator()
 {
     if (this.correlationKeyCalculator == null)
     {
         CorrelationKeyCalculator calculator = new CorrelationKeyCalculator(this.ScopeName);
         foreach (CorrelationQuery query in this.queries)
         {
             IDictionary <string, MessageQueryTable <string> > selectAdditional = new Dictionary <string, MessageQueryTable <string> >();
             int num = 0;
             foreach (MessageQuerySet set in query.SelectAdditional)
             {
                 selectAdditional.Add("SelectAdditional_item_" + num, set.GetMessageQueryTable());
                 num++;
             }
             calculator.AddQuery(query.Where, (query.Select != null) ? query.Select.GetMessageQueryTable() : new MessageQueryTable <string>(), selectAdditional, query.IsDefaultContextQuery);
         }
         this.correlationKeyCalculator = calculator;
     }
     return(this.correlationKeyCalculator);
 }
示例#9
0
        public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
        {
            if (operationDescription == null)
            {
                throw System.ServiceModel.Activities.FxTrace.Exception.ArgumentNull("operationDescription");
            }
            if (dispatchOperation == null)
            {
                throw System.ServiceModel.Activities.FxTrace.Exception.ArgumentNull("dispatchOperation");
            }
            if (((dispatchOperation.Parent == null) || (dispatchOperation.Parent.ChannelDispatcher == null)) || (((dispatchOperation.Parent.ChannelDispatcher.Host == null) || (dispatchOperation.Parent.ChannelDispatcher.Host.Description == null)) || (dispatchOperation.Parent.ChannelDispatcher.Host.Description.Behaviors == null)))
            {
                throw System.ServiceModel.Activities.FxTrace.Exception.AsError(new InvalidOperationException(System.ServiceModel.Activities.SR.DispatchOperationInInvalidState));
            }
            ServiceHostBase host = dispatchOperation.Parent.ChannelDispatcher.Host;

            if (!(host is WorkflowServiceHost))
            {
                throw System.ServiceModel.Activities.FxTrace.Exception.AsError(new InvalidOperationException(System.ServiceModel.Activities.SR.WorkflowBehaviorWithNonWorkflowHost(typeof(WorkflowOperationBehavior).Name)));
            }
            CorrelationKeyCalculator keyCalculator = null;
            ServiceEndpoint          endpoint      = null;

            foreach (ServiceEndpoint endpoint2 in host.Description.Endpoints)
            {
                if (endpoint2.Id == dispatchOperation.Parent.EndpointDispatcher.Id)
                {
                    endpoint = endpoint2;
                    break;
                }
            }
            if (endpoint != null)
            {
                CorrelationQueryBehavior behavior = endpoint.Behaviors.Find <CorrelationQueryBehavior>();
                if (behavior != null)
                {
                    keyCalculator = behavior.GetKeyCalculator();
                }
            }
            dispatchOperation.Invoker = new WorkflowOperationInvoker(operationDescription, endpoint, keyCalculator, this, host, dispatchOperation.Invoker);
        }
示例#10
0
        public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
        {
            ServiceHostBase host = dispatchOperation.Parent.ChannelDispatcher.Host;

            if (!(host is WorkflowServiceHost))
            {
                throw FxTrace.Exception.AsError(new InvalidOperationException(System.ServiceModel.Activities.SR.WorkflowBehaviorWithNonWorkflowHost(typeof(ControlOperationBehavior).Name)));
            }
            ServiceEndpoint endpoint = null;

            foreach (ServiceEndpoint endpoint2 in host.Description.Endpoints)
            {
                if (endpoint2.Id == dispatchOperation.Parent.EndpointDispatcher.Id)
                {
                    endpoint = endpoint2;
                    break;
                }
            }
            if (this.isWrappedMode)
            {
                CorrelationKeyCalculator correlationKeyCalculator = null;
                if (endpoint != null)
                {
                    CorrelationQueryBehavior behavior = endpoint.Behaviors.Find <CorrelationQueryBehavior>();
                    if (behavior != null)
                    {
                        correlationKeyCalculator = behavior.GetKeyCalculator();
                    }
                }
                dispatchOperation.Invoker = new ControlOperationInvoker(operationDescription, endpoint, correlationKeyCalculator, dispatchOperation.Invoker, host);
            }
            else
            {
                dispatchOperation.Invoker = new ControlOperationInvoker(operationDescription, endpoint, null, host);
            }
        }
 public ControlOperationInvoker(OperationDescription description, ServiceEndpoint endpoint,
     CorrelationKeyCalculator correlationKeyCalculator, ServiceHostBase host)
     : this(description, endpoint, correlationKeyCalculator, null, host)
 {
 }
 public WorkflowOperationInvoker(OperationDescription operationDescription, ServiceEndpoint endpoint,
     CorrelationKeyCalculator keyCalculator, WorkflowOperationBehavior behavior, ServiceHostBase host, IOperationInvoker innerInvoker)
     : base(operationDescription, endpoint, keyCalculator, host)
 {
     Fx.Assert(operationDescription != null, "Null OperationDescription");
     Fx.Assert(behavior != null, "Null WorkflowOperationBehavior");
     this.StaticBookmarkName = behavior.bookmark == null ? null : behavior.bookmark.Name;
     this.behavior = behavior;
     this.CanCreateInstance = behavior.CanCreateInstance;
     this.performanceCountersEnabled = PerformanceCounters.PerformanceCountersEnabled;
     this.propagateActivity = TraceUtility.ShouldPropagateActivity;
     this.isHostingEndpoint = endpoint is WorkflowHostingEndpoint;
     this.innerInvoker = innerInvoker;
     this.isFirstReceiveOfTransactedReceiveScopeTree = operationDescription.IsFirstReceiveOfTransactedReceiveScopeTree;
 }
        public static Message InitializeCorrelationHandles(NativeActivityContext context, CorrelationHandle selectHandle, CorrelationHandle ambientHandle, Collection <CorrelationInitializer> additionalCorrelations, CorrelationKeyCalculator keyCalculator, Message message)
        {
            InstanceKey key;
            ICollection <InstanceKey> is2;
            MessageBuffer             buffer = message.CreateBufferedCopy(0x7fffffff);

            if (keyCalculator.CalculateKeys(buffer, message, out key, out is2))
            {
                InitializeCorrelationHandles(context, selectHandle, ambientHandle, additionalCorrelations, key, is2);
            }
            return(buffer.CreateMessage());
        }