//[OperationContract]
        public bool ServiceIsExists(string serviceName)
        {
            try
            {
                ExportServiceHost host = ServiceHostManager.Services.First <ExportServiceHost>(h => h.GetServiceName() == serviceName);
                return(host != null);
            }
            catch (ArgumentNullException)
            {
                // Todo: ArgumentNullException
            }
            catch (InvalidOperationException)
            {
                // Todo: InvalidOperationException
            }

            return(false);
        }
        //[OperationContract]
        public Uri[] GetServiceAddress(string serviceName)
        {
            try
            {
                ExportServiceHost host = ServiceHostManager.Services.First <ExportServiceHost>(h => h.GetServiceName() == serviceName);
                return(host.GetAddresses());
            }
            catch (ArgumentNullException)
            {
                // Todo: ArgumentNullException
            }
            catch (InvalidOperationException)
            {
                // Todo: InvalidOperationException
            }

            return(null);
        }
        /// <summary>
        /// Creates an instance of <see cref="ExportServiceHost"/> using service metadata.
        /// </summary>
        /// <param name="container">The composition container.</param>
        /// <param name="meta">The metadata.</param>
        public static ExportServiceHost CreateExportServiceHost(CompositionContainer container, IHostedServiceMetadata meta)
        {
            if (container == null) throw new ArgumentNullException("container");
            if (meta == null) throw new ArgumentNullException("meta");

            var host = new ExportServiceHost(meta, new Uri[0]);
            host.Description.Behaviors.Add(new ExportServiceBehavior(container, meta.Name));
#if WITH_TOKEN
            if (meta.TokenValidationMode == TokenValidationMode.Check)
                host.Description.Behaviors.Add(new TokenValidationServiceBehavior(container));
#endif

#if WITH_ERROR_HANDLER
            foreach (ServiceEndpoint se in host.Description.Endpoints)
                se.Behaviors.Add(new EndpointErrorHandlerBehavior(container));
#endif

            return host;
        }
        /// <summary>
        /// Creates an instance of <see cref="ExportServiceHost"/> using service metadata.
        /// </summary>
        /// <param name="container">The composition container.</param>
        /// <param name="meta">The metadata.</param>
        public static ExportServiceHost CreateExportServiceHost(CompositionContainer container, IHostedServiceMetadata meta)
        {
            if (container == null) throw new ArgumentNullException("container");
            if (meta == null) throw new ArgumentNullException("meta");

            var host = new ExportServiceHost(meta, new Uri[0]);
            host.Description.Behaviors.Add(new ExportServiceBehavior(container, meta.Name));

            foreach (var behavior in BehaviorFactory.GetConfiguredBehaviors(meta.Name))
            {
                var behaviorType = behavior.GetType();
                if (host.Description.Behaviors.Contains(behaviorType))
                {
                    host.Description.Behaviors.Remove(behaviorType);
                }
                host.Description.Behaviors.Add(behavior);
            }

            return host;
        }
        /// <summary>
        /// Creates the service host that will handle web service requests.
        /// </summary>
        /// <param name="constructorString">The constructor string used to select the service.</param>
        /// <param name="baseAddresses">The set of base address for the service.</param>
        /// <returns>An instance of <see cref="ServiceHostBase"/> for the service.</returns>
        public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
        {
            var meta = Container
                .GetExports<IHostedService, IHostedServiceMetadata>()
                .Where(e => e.Metadata.Name.Equals(constructorString, StringComparison.OrdinalIgnoreCase))
                .Select(e => e.Metadata)
                .SingleOrDefault();

            if (meta == null)
                return null;

            var host = new ExportServiceHost(meta, baseAddresses);
            host.Description.Behaviors.Add(new ExportServiceBehavior(Container, meta.Name));

            var contracts = meta.ServiceType
                .GetInterfaces()
                .Where(t => t.IsDefined(typeof(ServiceContractAttribute), true));

            EnsureHttpBinding(host, contracts);

            return host;
        }
        /// <summary>
        /// Ensures that the Http binding has been created.
        /// </summary>
        /// <param name="host">The Http binding.</param>
        /// <param name="contracts">The set of contracts</param>
        private static void EnsureHttpBinding(ExportServiceHost host, IEnumerable<Type> contracts)
        {
            var binding = new BasicHttpBinding();

            host.Description.Endpoints.Clear();

            foreach (var contract in contracts)
                host.AddServiceEndpoint(contract.FullName, binding, "");
        }