void IServiceBehavior.Validate(ServiceDescription description,ServiceHostBase host) { DurableServiceAttribute durable = new DurableServiceAttribute(); durable.SaveStateInOperationTransaction = true; description.Behaviors.Add(durable); PersistenceProviderFactory factory; if(AutoCompleteInstance) { factory = new TransactionalInstanceProviderFactory(); } else { factory = new TransactionalMemoryProviderFactory(); } PersistenceProviderBehavior persistenceBehavior = new PersistenceProviderBehavior(factory); description.Behaviors.Add(persistenceBehavior); if(TransactionRequiredAllOperations) { foreach(ServiceEndpoint endpoint in description.Endpoints) { foreach(OperationDescription operation in endpoint.Contract.Operations) { operation.Behaviors.Find<OperationBehaviorAttribute>().TransactionScopeRequired = true; } } } }
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { if (serviceDescription == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("serviceDescription"); } if (serviceHostBase == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("serviceHostBase"); } if (serviceDescription.Endpoints == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument("serviceDescription", SR2.GetString(SR2.NoEndpoints)); } PersistenceProviderBehavior providerBehavior = null; if (serviceDescription.Behaviors != null) { providerBehavior = serviceDescription.Behaviors.Find <PersistenceProviderBehavior>(); } if (providerBehavior == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new InvalidOperationException( SR2.GetString( SR2.NonNullPersistenceProviderRequired, typeof(PersistenceProvider).Name, typeof(DurableServiceAttribute).Name))); } if (providerBehavior.PersistenceProviderFactory == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new InvalidOperationException( SR2.GetString( SR2.NonNullPersistenceProviderRequired, typeof(PersistenceProvider).Name, typeof(DurableServiceAttribute).Name))); } providerBehavior.PersistenceProviderFactory.Open(); serviceHostBase.Closed += new EventHandler( delegate(object sender, EventArgs args) { Fx.Assert(sender is ServiceHostBase, "The sender should be serviceHostBase."); // We have no way of knowing whether the service host closed or aborted // so we err on the side of abort for right now. providerBehavior.PersistenceProviderFactory.Abort(); } ); DurableInstanceContextProvider instanceContextProvider = new ServiceDurableInstanceContextProvider( serviceHostBase, false, serviceDescription.ServiceType, providerBehavior.PersistenceProviderFactory, this.saveStateInOperationTransaction, this.unknownExceptionAction, new DurableRuntimeValidator(this.saveStateInOperationTransaction, this.unknownExceptionAction), providerBehavior.PersistenceOperationTimeout); DurableInstanceContextProvider singleCallInstanceContextProvider = null; IInstanceProvider instanceProvider = new DurableInstanceProvider(instanceContextProvider); bool includeExceptionDetails = false; if (serviceDescription.Behaviors != null) { ServiceBehaviorAttribute serviceBehavior = serviceDescription.Behaviors.Find <ServiceBehaviorAttribute>(); if (serviceBehavior != null) { includeExceptionDetails |= serviceBehavior.IncludeExceptionDetailInFaults; } ServiceDebugBehavior serviceDebugBehavior = serviceDescription.Behaviors.Find <ServiceDebugBehavior>(); if (serviceDebugBehavior != null) { includeExceptionDetails |= serviceDebugBehavior.IncludeExceptionDetailInFaults; } } IErrorHandler errorHandler = new ServiceErrorHandler(includeExceptionDetails); foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers) { ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher; if (channelDispatcher != null && channelDispatcher.HasApplicationEndpoints()) { if (this.unknownExceptionAction == UnknownExceptionAction.AbortInstance) { channelDispatcher.ErrorHandlers.Add(errorHandler); } foreach (EndpointDispatcher endpointDispatcher in channelDispatcher.Endpoints) { if (endpointDispatcher.IsSystemEndpoint) { continue; } ServiceEndpoint serviceEndPoint = serviceDescription.Endpoints.Find(new XmlQualifiedName(endpointDispatcher.ContractName, endpointDispatcher.ContractNamespace)); if (serviceEndPoint != null) { if (serviceEndPoint.Contract.SessionMode != SessionMode.NotAllowed) { endpointDispatcher.DispatchRuntime.InstanceContextProvider = instanceContextProvider; } else { if (singleCallInstanceContextProvider == null) { singleCallInstanceContextProvider = new ServiceDurableInstanceContextProvider( serviceHostBase, true, serviceDescription.ServiceType, providerBehavior.PersistenceProviderFactory, this.saveStateInOperationTransaction, this.unknownExceptionAction, new DurableRuntimeValidator(this.saveStateInOperationTransaction, this.unknownExceptionAction), providerBehavior.PersistenceOperationTimeout); } endpointDispatcher.DispatchRuntime.InstanceContextProvider = singleCallInstanceContextProvider; } endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new DurableMessageDispatchInspector(serviceEndPoint.Contract.SessionMode)); endpointDispatcher.DispatchRuntime.InstanceProvider = instanceProvider; WorkflowServiceBehavior.SetContractFilterToIncludeAllOperations(endpointDispatcher, serviceEndPoint.Contract); } } } } foreach (ServiceEndpoint endpoint in serviceDescription.Endpoints) { if (!endpoint.InternalIsSystemEndpoint(serviceDescription)) { foreach (OperationDescription opDescription in endpoint.Contract.Operations) { if (!opDescription.Behaviors.Contains(typeof(DurableOperationAttribute))) { opDescription.Behaviors.Add(DurableOperationAttribute.DefaultInstance); } } } } }