void IOperationBehavior.ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch) { if (dispatch == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("dispatch"); } if (description == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("description"); } if (description.SyncMethod != null) { if (description.BeginMethod != null) { OperationBehaviorAttribute attribute = description.Behaviors.Find <OperationBehaviorAttribute>(); if ((attribute != null) && attribute.PreferAsyncInvocation) { dispatch.Invoker = new AsyncMethodInvoker(description.BeginMethod, description.EndMethod); } else { dispatch.Invoker = new SyncMethodInvoker(description.SyncMethod); } } else { dispatch.Invoker = new SyncMethodInvoker(description.SyncMethod); } } else if (description.BeginMethod != null) { dispatch.Invoker = new AsyncMethodInvoker(description.BeginMethod, description.EndMethod); } }
private static void EnableTransactionBehavior(OperationDescription operationDescription) { OperationBehaviorAttribute attribute = operationDescription.Behaviors.Find <OperationBehaviorAttribute>(); if (attribute != null) { attribute.TransactionScopeRequired = true; attribute.TransactionAutoComplete = false; } else { OperationBehaviorAttribute item = new OperationBehaviorAttribute { TransactionAutoComplete = false, TransactionScopeRequired = true }; operationDescription.Behaviors.Add(item); } TransactionFlowAttribute attribute4 = operationDescription.Behaviors.Find <TransactionFlowAttribute>(); if (attribute4 != null) { if (attribute4.Transactions != TransactionFlowOption.Allowed) { throw System.ServiceModel.Activities.FxTrace.Exception.AsError(new InvalidOperationException(System.ServiceModel.Activities.SR.ContractInferenceValidationForTransactionFlowBehavior)); } } else if (!operationDescription.IsOneWay) { operationDescription.Behaviors.Add(new TransactionFlowAttribute(TransactionFlowOption.Allowed)); } }
void EnforceStatefulActorEndpointBehaviorPolicy(ServiceDescription serviceDescription) { IEnumerable <ServiceRemotingDispatcher> remotingDispatchers = GetDispatchers(serviceDescription.ServiceType); ActorInstanceContextProvider contextProvider = new ActorInstanceContextProvider(); foreach (ServiceEndpoint endpoint in serviceDescription.Endpoints) { //All endpoints for a given Actor must share the same ActorInstanceContextProvider. endpoint.EndpointBehaviors.Add(contextProvider); endpoint.EndpointBehaviors.Add(new FabricThreadPoolBehavior()); endpoint.EndpointBehaviors.Add(new StatefulActorInstanceProvider()); endpoint.EndpointBehaviors.Add(new ServiceHeaderInterceptor(remotingDispatchers)); foreach (OperationDescription operation in endpoint.Contract.Operations) { if (operation.TaskMethod == null) { throw new InvalidOperationException("Validation failed. Actor operation '" + endpoint.Contract.ContractType.FullName + "." + operation.Name + "' does not return Task or Task<>. Actor interface methods must be async and must return either Task or Task<>."); } OperationBehaviorAttribute operationBehavior = operation.OperationBehaviors.FirstOrDefault(behavior => behavior is OperationBehaviorAttribute) as OperationBehaviorAttribute; operationBehavior.TransactionScopeRequired = true; operation.OperationBehaviors.Add(new ActorOperationBehavior(remotingDispatchers)); } } }
void EnforceStatefulActorEndpointBehaviorPolicy(ServiceDescription serviceDescription) { if (serviceDescription.Endpoints.Count(endpoint => !endpoint.Contract.ContractType.Namespace.Contains("ServiceModelEx")) > 1) { throw new InvalidOperationException("Validation failed. Multiple application interfaces found. An Actor may only possess a single application interface."); } ActorInstanceContextProvider contextProvider = new ActorInstanceContextProvider(); foreach (ServiceEndpoint endpoint in serviceDescription.Endpoints) { //All endpoints for a given Actor must share the same ActorInstanceContextProvider. endpoint.EndpointBehaviors.Add(contextProvider); endpoint.EndpointBehaviors.Add(new FabricThreadPoolBehavior()); endpoint.EndpointBehaviors.Add(new StatefulActorInstanceProvider()); foreach (OperationDescription operation in endpoint.Contract.Operations) { if (operation.TaskMethod == null) { throw new InvalidOperationException("Validation failed. Actor operation '" + endpoint.Contract.ContractType.FullName + "." + operation.Name + "' does not return Task or Task<>. Actor interface methods must be async and must return either Task or Task<>."); } OperationBehaviorAttribute operationBehavior = operation.OperationBehaviors.FirstOrDefault(behavior => behavior is OperationBehaviorAttribute) as OperationBehaviorAttribute; operationBehavior.TransactionScopeRequired = true; operation.OperationBehaviors.Add(new ActorOperationBehavior()); } } }
void ConfigureOperationDescriptionBehaviors(OperationDescription operation, IDataContractSurrogate contractSurrogate) { // DataContractSerializerOperationBehavior DataContractSerializerOperationBehavior contractSerializer = new DataContractSerializerOperationBehavior(operation, TypeLoader.DefaultDataContractFormatAttribute); if (null != contractSurrogate) { contractSerializer.DataContractSurrogate = contractSurrogate; } operation.Behaviors.Add(contractSerializer); // OperationInvokerBehavior operation.Behaviors.Add(new OperationInvokerBehavior()); if (info.TransactionOption == TransactionOption.Supported || info.TransactionOption == TransactionOption.Required) { operation.Behaviors.Add(new TransactionFlowAttribute(TransactionFlowOption.Allowed)); } // OperationBehaviorAttribute OperationBehaviorAttribute operationBehaviorAttribute = new OperationBehaviorAttribute(); operationBehaviorAttribute.TransactionAutoComplete = true; operationBehaviorAttribute.TransactionScopeRequired = false; operation.Behaviors.Add(operationBehaviorAttribute); }
void EnforceStatelessActorOperationBehaviorPolicy(ServiceDescription serviceDescription) { if (serviceDescription.Endpoints.Count(endpoint => !endpoint.Contract.ContractType.Namespace.Contains("ServiceModelEx")) > 1) { throw new InvalidOperationException("Validation failed. Multiple application interfaces found. An actor may only possess a single application interface."); } foreach (ServiceEndpoint endpoint in serviceDescription.Endpoints) { endpoint.EndpointBehaviors.Add(new FabricThreadPoolBehavior()); foreach (OperationDescription operation in endpoint.Contract.Operations) { if (operation.TaskMethod == null) { throw new InvalidOperationException("Validation failed. Actor operation '" + endpoint.Contract.ContractType.FullName + "." + operation.Name + "' does not return Task or Task<>. Actor interface methods must be async and must return either Task or Task<>."); } if ((!typeof(IActor).GetMembers().Any(member => member.Name.Contains(operation.Name))) && (!operation.IsInitiating)) { throw new InvalidOperationException("Validation failed. Stateless Actor operations cannot be non-initiating. Operation: " + endpoint.Contract.ContractType.FullName + "." + operation.Name); } if (operation.TaskMethod.GetCustomAttributes <CompletesActorInstanceAttribute>().Any()) { throw new InvalidOperationException("Validation failed. Cannot apply CompletesActorInstanceAttribute to stateless actors."); } OperationBehaviorAttribute operationBehavior = operation.OperationBehaviors.FirstOrDefault(behavior => behavior is OperationBehaviorAttribute) as OperationBehaviorAttribute; Debug.Assert(operationBehavior.TransactionScopeRequired == false); operationBehavior.TransactionScopeRequired = false; operation.OperationBehaviors.Add(new ActorOperationBehavior()); } } }
static void FillBehaviorInfo(IOperationBehavior behavior, IWmiInstance existingInstance, out IWmiInstance instance) { Fx.Assert(null != existingInstance, ""); Fx.Assert(null != behavior, ""); instance = null; if (behavior is DataContractSerializerOperationBehavior) { instance = existingInstance.NewInstance("DataContractSerializerOperationBehavior"); DataContractSerializerOperationBehavior specificBehavior = (DataContractSerializerOperationBehavior)behavior; instance.SetProperty(AdministrationStrings.IgnoreExtensionDataObject, specificBehavior.IgnoreExtensionDataObject); instance.SetProperty(AdministrationStrings.MaxItemsInObjectGraph, specificBehavior.MaxItemsInObjectGraph); if (null != specificBehavior.DataContractFormatAttribute) { instance.SetProperty(AdministrationStrings.Style, specificBehavior.DataContractFormatAttribute.Style.ToString()); } } else if (behavior is OperationBehaviorAttribute) { instance = existingInstance.NewInstance("OperationBehaviorAttribute"); OperationBehaviorAttribute specificBehavior = (OperationBehaviorAttribute)behavior; instance.SetProperty(AdministrationStrings.AutoDisposeParameters, specificBehavior.AutoDisposeParameters); instance.SetProperty(AdministrationStrings.Impersonation, specificBehavior.Impersonation.ToString()); instance.SetProperty(AdministrationStrings.ReleaseInstanceMode, specificBehavior.ReleaseInstanceMode.ToString()); instance.SetProperty(AdministrationStrings.TransactionAutoComplete, specificBehavior.TransactionAutoComplete); instance.SetProperty(AdministrationStrings.TransactionScopeRequired, specificBehavior.TransactionScopeRequired); } else if (behavior is TransactionFlowAttribute) { instance = existingInstance.NewInstance("TransactionFlowAttribute"); TransactionFlowAttribute specificBehavior = (TransactionFlowAttribute)behavior; instance.SetProperty(AdministrationStrings.TransactionFlowOption, specificBehavior.Transactions.ToString()); } else if (behavior is XmlSerializerOperationBehavior) { instance = existingInstance.NewInstance("XmlSerializerOperationBehavior"); XmlSerializerOperationBehavior specificBehavior = (XmlSerializerOperationBehavior)behavior; if (null != specificBehavior.XmlSerializerFormatAttribute) { instance.SetProperty(AdministrationStrings.Style, specificBehavior.XmlSerializerFormatAttribute.Style.ToString()); instance.SetProperty(AdministrationStrings.Use, specificBehavior.XmlSerializerFormatAttribute.Use.ToString()); instance.SetProperty(AdministrationStrings.SupportFaults, specificBehavior.XmlSerializerFormatAttribute.SupportFaults.ToString()); } } else if (behavior is IWmiInstanceProvider) { IWmiInstanceProvider instanceProvider = (IWmiInstanceProvider)behavior; instance = existingInstance.NewInstance(instanceProvider.GetInstanceType()); instanceProvider.FillInstance(instance); } else { instance = existingInstance.NewInstance("Behavior"); } if (null != instance) { instance.SetProperty(AdministrationStrings.Type, behavior.GetType().FullName); } }
private static void FillBehaviorInfo(IOperationBehavior behavior, IWmiInstance existingInstance, out IWmiInstance instance) { instance = null; if (behavior is DataContractSerializerOperationBehavior) { instance = existingInstance.NewInstance("DataContractSerializerOperationBehavior"); DataContractSerializerOperationBehavior behavior2 = (DataContractSerializerOperationBehavior)behavior; instance.SetProperty("IgnoreExtensionDataObject", behavior2.IgnoreExtensionDataObject); instance.SetProperty("MaxItemsInObjectGraph", behavior2.MaxItemsInObjectGraph); if (behavior2.DataContractFormatAttribute != null) { instance.SetProperty("Style", behavior2.DataContractFormatAttribute.Style.ToString()); } } else if (behavior is OperationBehaviorAttribute) { instance = existingInstance.NewInstance("OperationBehaviorAttribute"); OperationBehaviorAttribute attribute = (OperationBehaviorAttribute)behavior; instance.SetProperty("AutoDisposeParameters", attribute.AutoDisposeParameters); instance.SetProperty("Impersonation", attribute.Impersonation.ToString()); instance.SetProperty("ReleaseInstanceMode", attribute.ReleaseInstanceMode.ToString()); instance.SetProperty("TransactionAutoComplete", attribute.TransactionAutoComplete); instance.SetProperty("TransactionScopeRequired", attribute.TransactionScopeRequired); } else if (behavior is TransactionFlowAttribute) { instance = existingInstance.NewInstance("TransactionFlowAttribute"); TransactionFlowAttribute attribute2 = (TransactionFlowAttribute)behavior; instance.SetProperty("TransactionFlowOption", attribute2.Transactions.ToString()); } else if (behavior is XmlSerializerOperationBehavior) { instance = existingInstance.NewInstance("XmlSerializerOperationBehavior"); XmlSerializerOperationBehavior behavior3 = (XmlSerializerOperationBehavior)behavior; if (behavior3.XmlSerializerFormatAttribute != null) { instance.SetProperty("Style", behavior3.XmlSerializerFormatAttribute.Style.ToString()); instance.SetProperty("Use", behavior3.XmlSerializerFormatAttribute.Use.ToString()); instance.SetProperty("SupportFaults", behavior3.XmlSerializerFormatAttribute.SupportFaults.ToString()); } } else if (behavior is IWmiInstanceProvider) { IWmiInstanceProvider provider = (IWmiInstanceProvider)behavior; instance = existingInstance.NewInstance(provider.GetInstanceType()); provider.FillInstance(instance); } else { instance = existingInstance.NewInstance("Behavior"); } if (instance != null) { instance.SetProperty("Type", behavior.GetType().FullName); } }
private void ValidateScopeRequiredAndAutoComplete(OperationDescription operation, bool singleThreaded, string contractName) { OperationBehaviorAttribute attribute = operation.Behaviors.Find <OperationBehaviorAttribute>(); if (((attribute != null) && !singleThreaded) && !attribute.TransactionAutoComplete) { string name = "SFxTransactionNonConcurrentOrAutoComplete2"; throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString(name, new object[] { contractName, operation.Name }))); } }
private bool IsAutoComplete(OperationDescription operation) { OperationBehaviorAttribute attribute = operation.Behaviors.Find <OperationBehaviorAttribute>(); if (attribute != null) { return(attribute.TransactionAutoComplete); } return(true); }
private bool HasTransactedOperations(ServiceEndpoint endpoint) { for (int i = 0; i < endpoint.Contract.Operations.Count; i++) { OperationDescription description = endpoint.Contract.Operations[i]; OperationBehaviorAttribute attribute = description.Behaviors.Find <OperationBehaviorAttribute>(); if ((attribute != null) && attribute.TransactionScopeRequired) { return(true); } } return(false); }
bool HasTransactedOperations(ServiceEndpoint endpoint) { for (int j = 0; j < endpoint.Contract.Operations.Count; j++) { OperationDescription operation = endpoint.Contract.Operations[j]; OperationBehaviorAttribute attribute = operation.Behaviors.Find <OperationBehaviorAttribute>(); if (attribute != null && attribute.TransactionScopeRequired) { return(true); } } return(false); }
public static void ImpersonateAll(this ServiceDescription description) { foreach (ServiceEndpoint endpoint in description.Endpoints) { if (endpoint.Contract.Name == "IMetadataExchange") { continue; } foreach (OperationDescription operation in endpoint.Contract.Operations) { OperationBehaviorAttribute attribute = operation.Behaviors.Find <OperationBehaviorAttribute>(); attribute.Impersonation = ImpersonationOption.Allowed; } } }
void ValidateScopeRequiredAndAutoComplete(OperationDescription operation, bool singleThreaded, string contractName) { OperationBehaviorAttribute attribute = operation.Behaviors.Find <OperationBehaviorAttribute>(); if (attribute != null) { if (!singleThreaded && !attribute.TransactionAutoComplete) { string id = SR.SFxTransactionNonConcurrentOrAutoComplete2; throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException( SR.GetString(id, contractName, operation.Name))); } } }
void IOperationBehavior.ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch) { if (dispatch == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("dispatch"); } if (description == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("description"); } if (description.TaskMethod != null) { dispatch.Invoker = new TaskMethodInvoker(description.TaskMethod, description.TaskTResult); } else if (description.SyncMethod != null) { if (description.BeginMethod != null) { // both [....] and async methods are present on the contract, check the preference OperationBehaviorAttribute operationBehaviorAttribue = description.Behaviors.Find <OperationBehaviorAttribute>(); if ((operationBehaviorAttribue != null) && operationBehaviorAttribue.PreferAsyncInvocation) { dispatch.Invoker = new AsyncMethodInvoker(description.BeginMethod, description.EndMethod); } else { dispatch.Invoker = new SyncMethodInvoker(description.SyncMethod); } } else { // only [....] method is present on the contract dispatch.Invoker = new SyncMethodInvoker(description.SyncMethod); } } else { if (description.BeginMethod != null) { // only async method is present on the contract dispatch.Invoker = new AsyncMethodInvoker(description.BeginMethod, description.EndMethod); } } }
public static void ImpersonateAll(this ServiceDescription description) { foreach (ServiceEndpoint endpoint in description.Endpoints) { foreach (OperationDescription operation in endpoint.Contract.Operations) { OperationBehaviorAttribute attribute = operation.Behaviors.Find <OperationBehaviorAttribute>(); if (attribute != null) { if (attribute.Impersonation == ImpersonationOption.NotAllowed) { Trace.WriteLine("Overriding impersonation setting of " + endpoint.Contract.Name + "." + operation.Name); } attribute.Impersonation = ImpersonationOption.Required; continue; } } } }
public static ContractDescription GetContract(Type contractType) { Fx.Assert(contractType != null, "The discoveryContractType attribute must not be null."); ContractDescription discoveryContract = ContractDescription.GetContract(contractType); OperationBehaviorAttribute operationBehaviorAttribute; foreach (OperationDescription operationDescription in discoveryContract.Operations) { operationBehaviorAttribute = operationDescription.Behaviors.Find<OperationBehaviorAttribute>(); if (operationBehaviorAttribute == null) { operationBehaviorAttribute = new OperationBehaviorAttribute(); operationDescription.Behaviors.Add(operationBehaviorAttribute); } operationBehaviorAttribute.PreferAsyncInvocation = true; } return discoveryContract; }
public void TestContractFromObject() { ContractDescription cd = ContractDescription.GetContract(typeof(Foo)); ServiceAssert.AssertContractDescription(typeof(IFoo).Name, "http://tempuri.org/", SessionMode.Allowed, typeof(IFoo), null, cd, "#1"); Assert.AreEqual(cd.Operations.Count, 2); OperationBehaviorAttribute op = cd.Operations.Find("HeyHey").Behaviors.Find <OperationBehaviorAttribute> (); Assert.IsNotNull(op); Assert.AreEqual( op.ReleaseInstanceMode, ReleaseInstanceMode.None, "#2"); cd = ContractDescription.GetContract(typeof(IFoo), typeof(Foo)); ServiceAssert.AssertContractDescription(typeof(IFoo).Name, "http://tempuri.org/", SessionMode.Allowed, typeof(IFoo), null, cd, "#3"); Assert.AreEqual(cd.Operations.Count, 2, "#4"); Assert.AreEqual( cd.Operations.Find("HeyHey").Behaviors.Find <OperationBehaviorAttribute> ().ReleaseInstanceMode, ReleaseInstanceMode.AfterCall, "#5"); }
private void ConfigureOperationDescriptionBehaviors(OperationDescription operation, IDataContractSurrogate contractSurrogate) { DataContractSerializerOperationBehavior item = new DataContractSerializerOperationBehavior(operation, TypeLoader.DefaultDataContractFormatAttribute); if (contractSurrogate != null) { item.DataContractSurrogate = contractSurrogate; } operation.Behaviors.Add(item); operation.Behaviors.Add(new OperationInvokerBehavior()); if ((this.info.TransactionOption == TransactionOption.Supported) || (this.info.TransactionOption == TransactionOption.Required)) { operation.Behaviors.Add(new TransactionFlowAttribute(TransactionFlowOption.Allowed)); } OperationBehaviorAttribute attribute = new OperationBehaviorAttribute { TransactionAutoComplete = true, TransactionScopeRequired = false }; operation.Behaviors.Add(attribute); }
void EnforceStatelessServiceOperationBehaviorPolicy(ServiceDescription serviceDescription) { foreach (ServiceEndpoint endpoint in serviceDescription.Endpoints) { endpoint.EndpointBehaviors.Add(new FabricThreadPoolBehavior()); foreach (OperationDescription operation in endpoint.Contract.Operations) { if (operation.TaskMethod == null) { throw new InvalidOperationException("Validation failed. Service operation '" + endpoint.Contract.ContractType.FullName + "." + operation.Name + "' does not return Task or Task<>. Service interface methods must be async and must return either Task or Task<>."); } OperationBehaviorAttribute operationBehavior = operation.OperationBehaviors.FirstOrDefault(behavior => behavior is OperationBehaviorAttribute) as OperationBehaviorAttribute; Debug.Assert(operationBehavior.TransactionScopeRequired == false); operationBehavior.TransactionScopeRequired = false; operation.OperationBehaviors.Add(new ServiceOperationBehavior()); } } }
public static ContractDescription GetContract(Type contractType) { Fx.Assert(contractType != null, "The discoveryContractType attribute must not be null."); ContractDescription discoveryContract = ContractDescription.GetContract(contractType); OperationBehaviorAttribute operationBehaviorAttribute; foreach (OperationDescription operationDescription in discoveryContract.Operations) { operationBehaviorAttribute = operationDescription.Behaviors.Find <OperationBehaviorAttribute>(); if (operationBehaviorAttribute == null) { operationBehaviorAttribute = new OperationBehaviorAttribute(); operationDescription.Behaviors.Add(operationBehaviorAttribute); } operationBehaviorAttribute.PreferAsyncInvocation = true; } return(discoveryContract); }
public static void ImpersonateAll(ServiceDescription description) { foreach(ServiceEndpoint endpoint in description.Endpoints) { foreach(OperationDescription operation in endpoint.Contract.Operations) { foreach(IOperationBehavior behavior in operation.Behaviors) { if(behavior is OperationBehaviorAttribute) { OperationBehaviorAttribute attribute = behavior as OperationBehaviorAttribute; if(attribute.Impersonation == ImpersonationOption.NotAllowed) { Trace.WriteLine("Overriding impersonation setting of " + endpoint.Contract.Name + "." + operation.Name); } attribute.Impersonation = ImpersonationOption.Required; break; } } } } }
void ConfigureServiceBehavior() { ServiceBehaviorAttribute behavior = Description.Behaviors.Find <ServiceBehaviorAttribute>(); if (behavior.InstanceContextMode != InstanceContextMode.Single) { behavior.InstanceContextMode = InstanceContextMode.PerCall; behavior.ConcurrencyMode = ConcurrencyMode.Multiple; foreach (ServiceEndpoint endpoint in Description.Endpoints) { foreach (OperationDescription operation in endpoint.Contract.Operations) { OperationBehaviorAttribute attribute = operation.Behaviors.Find <OperationBehaviorAttribute>(); if (attribute.TransactionScopeRequired == true) { behavior.ReleaseServiceInstanceOnTransactionComplete = false; return; } } } } }
static void EnableTransactionBehavior(OperationDescription operationDescription) { Fx.Assert(operationDescription != null, "OperationDescription is null"); OperationBehaviorAttribute attribute = operationDescription.Behaviors.Find <OperationBehaviorAttribute>(); if (attribute != null) { attribute.TransactionScopeRequired = true; attribute.TransactionAutoComplete = false; } else { OperationBehaviorAttribute attr = new OperationBehaviorAttribute { TransactionAutoComplete = false, TransactionScopeRequired = true }; operationDescription.Behaviors.Add(attr); } TransactionFlowAttribute transactionFlowAttribute = operationDescription.Behaviors.Find <TransactionFlowAttribute>(); if (transactionFlowAttribute != null) { if (transactionFlowAttribute.Transactions != TransactionFlowOption.Allowed) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR.ContractInferenceValidationForTransactionFlowBehavior)); } } else { if (!operationDescription.IsOneWay) { operationDescription.Behaviors.Add(new TransactionFlowAttribute(TransactionFlowOption.Allowed)); } } }
protected WorkflowHostingEndpoint(Type contractType, Binding binding, EndpointAddress address) : base(ContractDescription.GetContract(contractType), binding, address) { this.IsSystemEndpoint = true; this.Contract.Behaviors.Add(new ServiceMetadataContractBehavior(false)); this.Contract.Behaviors.Add(new WorkflowHostingContractBehavior()); Fx.Assert(!this.Behaviors.Contains(typeof(CorrelationQueryBehavior)), "Must not contain correlation query!"); this.correlationQueries = new Collection <CorrelationQuery>(); this.Behaviors.Add(new CorrelationQueryBehavior(this.correlationQueries)); // If TransactionFlowOption.Allowed or TransactionFlowOption.Mandatory is defined on an operation, we will set // TransactionScopeRequired = true for that operation. The operation will become transacted (use transaction flow, // or create one locally). For usability reason, we assume this is the majority usage. User could opt out by // setting TransactionScopeRequired to false or remove the TransactionFlowAttribute from the operation. foreach (OperationDescription operationDescription in this.Contract.Operations) { TransactionFlowAttribute transactionFlow = operationDescription.Behaviors.Find <TransactionFlowAttribute>(); if (transactionFlow != null && transactionFlow.Transactions != TransactionFlowOption.NotAllowed) { OperationBehaviorAttribute operationAttribute = operationDescription.Behaviors.Find <OperationBehaviorAttribute>(); operationAttribute.TransactionScopeRequired = true; } } }
// Token: 0x06001674 RID: 5748 RVA: 0x00052B28 File Offset: 0x00050D28 private static void ProcessMethod(MethodInfo methodInfo, Dictionary <string, MethodInfo> endMethodMap, Dictionary <string, ServiceMethodInfo> methodTable, List <Attribute> attributes) { OperationContractAttribute customAttribute = OwaServiceMethodMap.GetCustomAttribute <OperationContractAttribute>(attributes); if (customAttribute == null) { return; } WebInvokeAttribute customAttribute2 = OwaServiceMethodMap.GetCustomAttribute <WebInvokeAttribute>(attributes); JsonRequestFormatAttribute customAttribute3 = OwaServiceMethodMap.GetCustomAttribute <JsonRequestFormatAttribute>(attributes); WebGetAttribute customAttribute4 = OwaServiceMethodMap.GetCustomAttribute <WebGetAttribute>(attributes); OperationBehaviorAttribute customAttribute5 = OwaServiceMethodMap.GetCustomAttribute <OperationBehaviorAttribute>(attributes); JsonResponseOptionsAttribute customAttribute6 = OwaServiceMethodMap.GetCustomAttribute <JsonResponseOptionsAttribute>(attributes); JsonRequestWrapperTypeAttribute customAttribute7 = OwaServiceMethodMap.GetCustomAttribute <JsonRequestWrapperTypeAttribute>(attributes); AsyncStateMachineAttribute customAttribute8 = OwaServiceMethodMap.GetCustomAttribute <AsyncStateMachineAttribute>(attributes); bool flag = customAttribute != null && customAttribute.AsyncPattern; bool flag2 = customAttribute8 != null; bool flag3 = customAttribute5 == null || customAttribute5.AutoDisposeParameters; bool isResponseCacheable = customAttribute6 != null && customAttribute6.IsCacheable; WebMessageBodyStyle webMessageBodyStyle = (customAttribute2 != null) ? customAttribute2.BodyStyle : WebMessageBodyStyle.Bare; if (customAttribute2 != null) { WebMessageFormat requestFormat = customAttribute2.RequestFormat; } if (customAttribute2 != null) { WebMessageFormat responseFormat = customAttribute2.ResponseFormat; } JsonRequestFormat jsonRequestFormat = (customAttribute3 != null) ? customAttribute3.Format : JsonRequestFormat.Custom; bool isHttpGet = (customAttribute2 != null) ? customAttribute2.Method.Equals("GET", StringComparison.InvariantCultureIgnoreCase) : (customAttribute4 != null); string text = (customAttribute2 != null) ? customAttribute2.UriTemplate : ((customAttribute4 != null) ? customAttribute4.UriTemplate : null); UriTemplate uriTemplate = (!string.IsNullOrEmpty(text)) ? new UriTemplate(text) : null; bool flag4 = webMessageBodyStyle == WebMessageBodyStyle.WrappedRequest || webMessageBodyStyle == WebMessageBodyStyle.Wrapped; bool isWrappedResponse = webMessageBodyStyle == WebMessageBodyStyle.WrappedResponse || webMessageBodyStyle == WebMessageBodyStyle.Wrapped; WebMessageFormat webMethodRequestFormat = (customAttribute2 != null && customAttribute2.IsRequestFormatSetExplicitly) ? customAttribute2.RequestFormat : WebMessageFormat.Json; WebMessageFormat webMethodResponseFormat = (customAttribute2 != null && customAttribute2.IsResponseFormatSetExplicitly) ? customAttribute2.ResponseFormat : WebMessageFormat.Json; Type type = (customAttribute7 != null) ? customAttribute7.Type : null; string text2 = methodInfo.Name; MethodInfo beginMethod = null; MethodInfo methodInfo2 = null; MethodInfo syncMethod = null; MethodInfo genericAsyncTaskMethod = null; Type type2 = null; Type type3; if (text2.StartsWith("Begin", StringComparison.InvariantCultureIgnoreCase) && flag) { type3 = ((methodInfo.GetParameters().Length > 0) ? methodInfo.GetParameters()[0].ParameterType : null); beginMethod = methodInfo; text2 = text2.Substring("Begin".Length); string key = "End" + text2; if (endMethodMap.TryGetValue(key, out methodInfo2)) { type2 = methodInfo2.ReturnType; } } else { syncMethod = methodInfo; type3 = ((methodInfo.GetParameters().Length > 0) ? methodInfo.GetParameters()[0].ParameterType : null); type2 = methodInfo.ReturnType; if (flag2 && type2 != null && type2.GenericTypeArguments != null && type2.GenericTypeArguments.Length > 0) { genericAsyncTaskMethod = OwaServiceMethodMap.handleAsyncMethodInfo.MakeGenericMethod(type2.GenericTypeArguments); type2 = type2.GenericTypeArguments[0]; } } bool isStreamedResponse = OwaServiceMethodMap.IsStreamResponse(type2); bool shouldAutoDisposeResponse = flag3 && OwaServiceMethodMap.ImplementsInterface <IDisposable>(type2); bool shouldAutoDisposeRequest = flag3 && OwaServiceMethodMap.ImplementsInterface <IDisposable>(type3); if (flag4 && type == null) { string wrappedRequestTypeName = OwaServiceMethodMap.GetWrappedRequestTypeName(text2); type = OwaServiceMethodMap.thisAssembly.GetType(wrappedRequestTypeName, false); } ServiceMethodInfo value = new ServiceMethodInfo { BeginMethod = beginMethod, EndMethod = methodInfo2, GenericAsyncTaskMethod = genericAsyncTaskMethod, IsAsyncAwait = flag2, IsAsyncPattern = flag, IsHttpGet = isHttpGet, IsResponseCacheable = isResponseCacheable, IsStreamedResponse = isStreamedResponse, IsWrappedRequest = flag4, IsWrappedResponse = isWrappedResponse, JsonRequestFormat = jsonRequestFormat, Name = text2, RequestType = type3, ResponseType = type2, ShouldAutoDisposeRequest = shouldAutoDisposeRequest, ShouldAutoDisposeResponse = shouldAutoDisposeResponse, SyncMethod = syncMethod, UriTemplate = uriTemplate, WebMethodRequestFormat = webMethodRequestFormat, WebMethodResponseFormat = webMethodResponseFormat, WrappedRequestType = type, WrappedRequestTypeParameterMap = OwaServiceMethodMap.BuildParameterMap(type) }; methodTable.Add(text2, value); }
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { if (serviceDescription == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("serviceDescription"); } ContextBindingElement.ValidateContextBindingElementOnAllEndpointsWithSessionfulContract(serviceDescription, this); if (serviceDescription.Behaviors != null) { ServiceBehaviorAttribute serviceBehavior = serviceDescription.Behaviors.Find <ServiceBehaviorAttribute>(); if (serviceBehavior != null) { if (serviceBehavior.InstanceContextMode != InstanceContextMode.PerSession) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new InvalidOperationException( SR2.GetString(SR2.InstanceContextModeMustBePerSession, serviceBehavior.InstanceContextMode))); } if (serviceBehavior.ConcurrencyMode == ConcurrencyMode.Multiple) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new InvalidOperationException( SR2.GetString(SR2.ConcurrencyMultipleNotSupported))); } if (serviceBehavior.ConcurrencyMode == ConcurrencyMode.Reentrant && this.UnknownExceptionAction == UnknownExceptionAction.AbortInstance) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new InvalidOperationException( SR2.GetString(SR2.ConcurrencyReentrantAndAbortNotSupported))); } } } bool foundSessionfulContract = false; foreach (ServiceEndpoint serviceEndpoint in serviceDescription.Endpoints) { if (serviceEndpoint != null && !serviceEndpoint.InternalIsSystemEndpoint(serviceDescription)) { if (serviceEndpoint.Contract.SessionMode != SessionMode.NotAllowed) { foundSessionfulContract = true; } foreach (OperationDescription operation in serviceEndpoint.Contract.Operations) { DurableOperationAttribute durableBehavior = operation.Behaviors.Find <DurableOperationAttribute>(); if (durableBehavior == null) { durableBehavior = defaultDurableOperationBehavior; } if (serviceEndpoint.Contract.SessionMode == SessionMode.NotAllowed) { if (!durableBehavior.CanCreateInstanceForOperation(operation.IsOneWay)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new InvalidOperationException( SR2.GetString( SR2.CanCreateInstanceMustBeTrue, serviceEndpoint.Contract.Name, operation.Name))); } } else { if (operation.IsOneWay && durableBehavior.CanCreateInstanceForOperation(operation.IsOneWay)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new InvalidOperationException( SR2.GetString( SR2.CanCreateInstanceMustBeTwoWay, serviceEndpoint.Contract.Name, serviceEndpoint.Contract.SessionMode, operation.Name))); } } if (this.saveStateInOperationTransaction) { bool hasTransaction = false; OperationBehaviorAttribute operationBehavior = operation.Behaviors.Find <OperationBehaviorAttribute>(); if (operationBehavior != null) { if (operationBehavior.TransactionScopeRequired) { hasTransaction = true; } } TransactionFlowAttribute transactionBehavior = operation.Behaviors.Find <TransactionFlowAttribute>(); if (transactionBehavior != null) { if (transactionBehavior.Transactions == TransactionFlowOption.Mandatory) { hasTransaction = true; } } if (!hasTransaction) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new InvalidOperationException( SR2.GetString( SR2.SaveStateInTransactionValidationFailed, operation.Name, serviceEndpoint.ListenUri))); } } } } } if (!foundSessionfulContract) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new InvalidOperationException( SR2.GetString(SR2.SessionfulContractNotFound))); } }
void CreateWorkflowManagementEndpoint(WorkflowServiceHost workflowServiceHost) { Binding controlEndpointBinding; if (workflowServiceHost.InternalBaseAddresses.Contains(Uri.UriSchemeNetPipe)) { controlEndpointBinding = NamedPipeControlEndpointBinding; } else if (workflowServiceHost.InternalBaseAddresses.Contains(Uri.UriSchemeHttp)) { controlEndpointBinding = HttpControlEndpointBinding; } else { return; } Uri controlEndpointAddress = ServiceHost.GetVia(controlEndpointBinding.Scheme, new Uri(ControlEndpointAddress, UriKind.Relative), workflowServiceHost.InternalBaseAddresses); XmlQualifiedName contractName = new XmlQualifiedName(XD2.WorkflowInstanceManagementService.ContractName, XD2.WorkflowServices.Namespace); //Create the Endpoint Dispatcher EndpointAddress address = new EndpointAddress(controlEndpointAddress.AbsoluteUri); EndpointDispatcher endpointDispatcher = new EndpointDispatcher(address, XD2.WorkflowInstanceManagementService.ContractName, XD2.WorkflowServices.Namespace, true) { ContractFilter = new ActionMessageFilter( NamingHelper.GetMessageAction(contractName, XD2.WorkflowInstanceManagementService.Abandon, null, false), NamingHelper.GetMessageAction(contractName, XD2.WorkflowInstanceManagementService.Cancel, null, false), NamingHelper.GetMessageAction(contractName, XD2.WorkflowInstanceManagementService.Run, null, false), NamingHelper.GetMessageAction(contractName, XD2.WorkflowInstanceManagementService.Suspend, null, false), NamingHelper.GetMessageAction(contractName, XD2.WorkflowInstanceManagementService.Terminate, null, false), NamingHelper.GetMessageAction(contractName, XD2.WorkflowInstanceManagementService.TransactedCancel, null, false), NamingHelper.GetMessageAction(contractName, XD2.WorkflowInstanceManagementService.TransactedRun, null, false), NamingHelper.GetMessageAction(contractName, XD2.WorkflowInstanceManagementService.TransactedSuspend, null, false), NamingHelper.GetMessageAction(contractName, XD2.WorkflowInstanceManagementService.TransactedTerminate, null, false), NamingHelper.GetMessageAction(contractName, XD2.WorkflowInstanceManagementService.TransactedUnsuspend, null, false), NamingHelper.GetMessageAction(contractName, XD2.WorkflowInstanceManagementService.TransactedUpdate, null, false), NamingHelper.GetMessageAction(contractName, XD2.WorkflowInstanceManagementService.Unsuspend, null, false), NamingHelper.GetMessageAction(contractName, XD2.WorkflowInstanceManagementService.Update, null, false)), }; //Create Listener ServiceEndpoint endpoint = new ServiceEndpoint(WorkflowControlEndpoint.WorkflowControlServiceContract, controlEndpointBinding, address); BindingParameterCollection parameters = workflowServiceHost.GetBindingParameters(endpoint); IChannelListener listener; if (controlEndpointBinding.CanBuildChannelListener <IDuplexSessionChannel>(controlEndpointAddress, parameters)) { listener = controlEndpointBinding.BuildChannelListener <IDuplexSessionChannel>(controlEndpointAddress, parameters); } else if (controlEndpointBinding.CanBuildChannelListener <IReplySessionChannel>(controlEndpointAddress, parameters)) { listener = controlEndpointBinding.BuildChannelListener <IReplySessionChannel>(controlEndpointAddress, parameters); } else { listener = controlEndpointBinding.BuildChannelListener <IReplyChannel>(controlEndpointAddress, parameters); } //Add the operations bool formatRequest; bool formatReply; foreach (OperationDescription operation in WorkflowControlEndpoint.WorkflowControlServiceContract.Operations) { DataContractSerializerOperationBehavior dataContractSerializerOperationBehavior = new DataContractSerializerOperationBehavior(operation); DispatchOperation operationDispatcher = new DispatchOperation(endpointDispatcher.DispatchRuntime, operation.Name, NamingHelper.GetMessageAction(operation, false), NamingHelper.GetMessageAction(operation, true)) { Formatter = (IDispatchMessageFormatter)dataContractSerializerOperationBehavior.GetFormatter(operation, out formatRequest, out formatReply, false), Invoker = new ControlOperationInvoker( operation, new WorkflowControlEndpoint(controlEndpointBinding, address), null, workflowServiceHost), }; endpointDispatcher.DispatchRuntime.Operations.Add(operationDispatcher); OperationBehaviorAttribute operationAttribute = operation.Behaviors.Find <OperationBehaviorAttribute>(); ((IOperationBehavior)operationAttribute).ApplyDispatchBehavior(operation, operationDispatcher); } DispatchRuntime dispatchRuntime = endpointDispatcher.DispatchRuntime; dispatchRuntime.ConcurrencyMode = ConcurrencyMode.Multiple; dispatchRuntime.InstanceContextProvider = new DurableInstanceContextProvider(workflowServiceHost); dispatchRuntime.InstanceProvider = new DurableInstanceProvider(workflowServiceHost); dispatchRuntime.ServiceAuthorizationManager = new WindowsAuthorizationManager(this.WindowsGroup); //Create the Channel Dispatcher ServiceDebugBehavior serviceDebugBehavior = workflowServiceHost.Description.Behaviors.Find <ServiceDebugBehavior>(); ServiceBehaviorAttribute serviceBehaviorAttribute = workflowServiceHost.Description.Behaviors.Find <ServiceBehaviorAttribute>(); bool includeDebugInfo = false; if (serviceDebugBehavior != null) { includeDebugInfo |= serviceDebugBehavior.IncludeExceptionDetailInFaults; } if (serviceBehaviorAttribute != null) { includeDebugInfo |= serviceBehaviorAttribute.IncludeExceptionDetailInFaults; } ChannelDispatcher channelDispatcher = new ChannelDispatcher(listener, controlEndpointBinding.Name, controlEndpointBinding) { MessageVersion = controlEndpointBinding.MessageVersion, Endpoints = { endpointDispatcher }, ServiceThrottle = workflowServiceHost.ServiceThrottle }; workflowServiceHost.ChannelDispatchers.Add(channelDispatcher); }
static void EnableTransactionBehavior(OperationDescription operationDescription) { Fx.Assert(operationDescription != null, "OperationDescription is null"); OperationBehaviorAttribute attribute = operationDescription.Behaviors.Find<OperationBehaviorAttribute>(); if (attribute != null) { attribute.TransactionScopeRequired = true; attribute.TransactionAutoComplete = false; } else { OperationBehaviorAttribute attr = new OperationBehaviorAttribute { TransactionAutoComplete = false, TransactionScopeRequired = true }; operationDescription.Behaviors.Add(attr); } TransactionFlowAttribute transactionFlowAttribute = operationDescription.Behaviors.Find<TransactionFlowAttribute>(); if (transactionFlowAttribute != null) { if (transactionFlowAttribute.Transactions != TransactionFlowOption.Allowed) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR.ContractInferenceValidationForTransactionFlowBehavior)); } } else { if (!operationDescription.IsOneWay) { operationDescription.Behaviors.Add(new TransactionFlowAttribute(TransactionFlowOption.Allowed)); } } }
protected override void OnOpening() { this.CreateEndpoints(); if (this.Description.Behaviors.Find <AspNetCompatibilityRequirementsAttribute>() == null) { this.Description.Behaviors.Add(new AspNetCompatibilityRequirementsAttribute { RequirementsMode = AspNetCompatibilityRequirementsMode.Required }); } //if (String.IsNullOrEmpty(this.Description.Namespace) || this.Description.Namespace == "http://tempuri.org/") // this.Description.Namespace = Constants.ServiceNamespace; foreach (var endpoint in this.Description.Endpoints) { foreach (var operation in endpoint.Contract.Operations) { bool wasCreated = false; var behavior = operation.Behaviors.Find <OperationBehaviorAttribute>(); if (behavior == null) { wasCreated = true; behavior = new OperationBehaviorAttribute(); } behavior.Impersonation = ImpersonationOption.Allowed; if (wasCreated) { operation.Behaviors.Add(behavior); } } } if (this.Description.Behaviors.Find <ServiceDebugBehavior>() == null) { var item = new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true }; this.Description.Behaviors.Add(item); } if (this.Description.Behaviors.Find <ServiceAuthorizationBehavior>() == null) { var item = new ServiceAuthorizationBehavior { ImpersonateCallerForAllOperations = true }; this.Description.Behaviors.Add(item); } else { this.Description.Behaviors.Find <ServiceAuthorizationBehavior>().ImpersonateCallerForAllOperations = true; } if (this.Description.Behaviors.Find <ServiceMetadataBehavior>() == null) { var item = new ServiceMetadataBehavior { MetadataExporter = { PolicyVersion = PolicyVersion.Policy15 } }; this.Description.Behaviors.Add(item); } else { var item = this.Description.Behaviors.Find <ServiceMetadataBehavior>(); item.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; } base.OnOpening(); }
static void EnsureTransactedInvoke(OperationDescription operationDescription) { OperationBehaviorAttribute operationAttribute = operationDescription.Behaviors.Find <OperationBehaviorAttribute>(); operationAttribute.TransactionScopeRequired = true; }
private void CreateWorkflowManagementEndpoint(WorkflowServiceHost workflowServiceHost) { Binding namedPipeControlEndpointBinding; IChannelListener listener; if (workflowServiceHost.InternalBaseAddresses.Contains(Uri.UriSchemeNetPipe)) { namedPipeControlEndpointBinding = NamedPipeControlEndpointBinding; } else if (workflowServiceHost.InternalBaseAddresses.Contains(Uri.UriSchemeHttp)) { namedPipeControlEndpointBinding = HttpControlEndpointBinding; } else { return; } Uri listenUriBaseAddress = ServiceHostBase.GetVia(namedPipeControlEndpointBinding.Scheme, new Uri("System.ServiceModel.Activities_IWorkflowInstanceManagement", UriKind.Relative), workflowServiceHost.InternalBaseAddresses); XmlQualifiedName contractName = new XmlQualifiedName("IWorkflowInstanceManagement", "http://schemas.datacontract.org/2008/10/WorkflowServices"); EndpointAddress address = new EndpointAddress(listenUriBaseAddress.AbsoluteUri); EndpointDispatcher item = new EndpointDispatcher(address, "IWorkflowInstanceManagement", "http://schemas.datacontract.org/2008/10/WorkflowServices", true) { ContractFilter = new ActionMessageFilter(new string[] { NamingHelper.GetMessageAction(contractName, "Abandon", null, false), NamingHelper.GetMessageAction(contractName, "Cancel", null, false), NamingHelper.GetMessageAction(contractName, "Run", null, false), NamingHelper.GetMessageAction(contractName, "Suspend", null, false), NamingHelper.GetMessageAction(contractName, "Terminate", null, false), NamingHelper.GetMessageAction(contractName, "TransactedCancel", null, false), NamingHelper.GetMessageAction(contractName, "TransactedRun", null, false), NamingHelper.GetMessageAction(contractName, "TransactedSuspend", null, false), NamingHelper.GetMessageAction(contractName, "TransactedTerminate", null, false), NamingHelper.GetMessageAction(contractName, "TransactedUnsuspend", null, false), NamingHelper.GetMessageAction(contractName, "Unsuspend", null, false) }) }; BindingParameterCollection parameters = new BindingParameterCollection(); VirtualPathExtension extension = workflowServiceHost.Extensions.Find <VirtualPathExtension>(); if (extension != null) { parameters.Add(extension); } ChannelProtectionRequirements requirements = new ChannelProtectionRequirements(); requirements.Add(ChannelProtectionRequirements.CreateFromContract(WorkflowControlEndpoint.WorkflowControlServiceContract, ProtectionLevel.EncryptAndSign, ProtectionLevel.EncryptAndSign, false)); parameters.Add(requirements); if (namedPipeControlEndpointBinding.CanBuildChannelListener <IDuplexSessionChannel>(new object[] { listenUriBaseAddress, parameters })) { listener = namedPipeControlEndpointBinding.BuildChannelListener <IDuplexSessionChannel>(listenUriBaseAddress, parameters); } else if (namedPipeControlEndpointBinding.CanBuildChannelListener <IReplySessionChannel>(new object[] { listenUriBaseAddress, parameters })) { listener = namedPipeControlEndpointBinding.BuildChannelListener <IReplySessionChannel>(listenUriBaseAddress, parameters); } else { listener = namedPipeControlEndpointBinding.BuildChannelListener <IReplyChannel>(listenUriBaseAddress, parameters); } foreach (OperationDescription description in WorkflowControlEndpoint.WorkflowControlServiceContract.Operations) { bool flag; bool flag2; DataContractSerializerOperationBehavior behavior = new DataContractSerializerOperationBehavior(description); DispatchOperation operation = new DispatchOperation(item.DispatchRuntime, description.Name, NamingHelper.GetMessageAction(description, false), NamingHelper.GetMessageAction(description, true)) { Formatter = (IDispatchMessageFormatter)behavior.GetFormatter(description, out flag, out flag2, false), Invoker = new ControlOperationInvoker(description, new WorkflowControlEndpoint(namedPipeControlEndpointBinding, address), null, workflowServiceHost) }; item.DispatchRuntime.Operations.Add(operation); OperationBehaviorAttribute attribute = description.Behaviors.Find <OperationBehaviorAttribute>(); ((IOperationBehavior)attribute).ApplyDispatchBehavior(description, operation); if (attribute.TransactionScopeRequired) { ((ITransactionChannelManager)listener).Dictionary.Add(new DirectionalAction(MessageDirection.Input, NamingHelper.GetMessageAction(description, false)), TransactionFlowOption.Allowed); } } DispatchRuntime dispatchRuntime = item.DispatchRuntime; dispatchRuntime.ConcurrencyMode = ConcurrencyMode.Multiple; dispatchRuntime.InstanceContextProvider = new DurableInstanceContextProvider(workflowServiceHost); dispatchRuntime.InstanceProvider = new DurableInstanceProvider(workflowServiceHost); dispatchRuntime.ServiceAuthorizationManager = new WindowsAuthorizationManager(this.WindowsGroup); ServiceDebugBehavior behavior2 = workflowServiceHost.Description.Behaviors.Find <ServiceDebugBehavior>(); ServiceBehaviorAttribute attribute2 = workflowServiceHost.Description.Behaviors.Find <ServiceBehaviorAttribute>(); bool flag3 = false; if (behavior2 != null) { flag3 |= behavior2.IncludeExceptionDetailInFaults; } if (attribute2 != null) { flag3 |= attribute2.IncludeExceptionDetailInFaults; } ChannelDispatcher dispatcher4 = new ChannelDispatcher(listener, namedPipeControlEndpointBinding.Name, namedPipeControlEndpointBinding) { MessageVersion = namedPipeControlEndpointBinding.MessageVersion }; dispatcher4.Endpoints.Add(item); dispatcher4.ServiceThrottle = workflowServiceHost.ServiceThrottle; ChannelDispatcher dispatcher2 = dispatcher4; workflowServiceHost.ChannelDispatchers.Add(dispatcher2); }