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; }
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>(); } }
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); }
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); }
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()); }