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));
            }
        }
Ejemplo n.º 3
0
        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));
                }
            }
        }
Ejemplo n.º 4
0
        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());
                }
            }
        }
Ejemplo n.º 5
0
        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);
     }
 }
Ejemplo n.º 9
0
        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 })));
            }
        }
Ejemplo n.º 10
0
        private bool IsAutoComplete(OperationDescription operation)
        {
            OperationBehaviorAttribute attribute = operation.Behaviors.Find <OperationBehaviorAttribute>();

            if (attribute != null)
            {
                return(attribute.TransactionAutoComplete);
            }
            return(true);
        }
Ejemplo n.º 11
0
 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);
                }
            }
        }
Ejemplo n.º 16
0
 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;
        }
Ejemplo n.º 18
0
        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");
        }
Ejemplo n.º 19
0
        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());
                }
            }
        }
Ejemplo n.º 21
0
        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);
        }
Ejemplo n.º 22
0
 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;
             }
          }
       }
    }
 }
Ejemplo n.º 23
0
        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;
                        }
                    }
                }
            }
        }
Ejemplo n.º 24
0
        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));
                }
            }
        }
Ejemplo n.º 25
0
        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();
        }
Ejemplo n.º 31
0
        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);
        }