public virtual bool Start() { ModuleProc PROC = new ModuleProc(this.DYN_MODULE_NAME, "Start"); bool result = false; try { if (_host == null) { lock (_lock) { if (_host == null) { // Host string hostName = Dns.GetHostName(); // Service implementation factory instances IWcfExecutorServiceFactory executorServiceFactory = this.OnCreateExecutorService(); IWcfExecutorServiceFactory executorServiceFactoryRest = this.OnCreateExecutorServiceRest(); if (executorServiceFactory == null) { return(false); } Type[] knownTypes = executorServiceFactory.KnownTypes; // Service implementation types _serverInstance = executorServiceFactory.CreateSingletonInstance(this.ExecutorService) as IWcfExecutorService; Type serviceType = executorServiceFactory.ServiceType; Type serviceTypeRest = null; Type[] knownTypesRest = null; if (executorServiceFactoryRest != null) { _serverInstanceRest = executorServiceFactoryRest.CreateSingletonInstance(this.ExecutorService) as IWcfExecutorServiceRest; serviceTypeRest = executorServiceFactoryRest.ServiceType; knownTypesRest = executorServiceFactoryRest.KnownTypes; } // Base address and bindings AddressHelper.SetBasePath(_basePath); Uri tcpUri = null, httpUri = null, httpUriWeb = null; bool hasTcp = false, hasHttp = false, hasWebHttp = false; IList <Uri> hostAddresses = new List <Uri>(); Binding bindingTcp = null, bindingHttp = null, bindingWebHttp = null; // uris if (_tcpPort > 0) { tcpUri = AddressHelper.CreateTcpAddress(hostName, _tcpPort); bindingTcp = ContractBindingsHelper.CreateTcpBinding(); hostAddresses.Add(tcpUri); hasTcp = true; } if (_httpPort > 0) { httpUri = AddressHelper.CreateHttpAddress(hostName, _httpPort); bindingHttp = this.OnCreateHttpBinding(); hostAddresses.Add(httpUri); hasHttp = true; } if (_webHttpPort > 0) { httpUriWeb = AddressHelper.CreateHttpAddress(hostName, _webHttpPort); bindingWebHttp = ContractBindingsHelper.CreateWebHttpBinding(); hasWebHttp = true; } // default service if ((hasTcp || hasHttp) && (serviceType != null)) { _host = this.OnCreateServiceHost(_serverInstance, knownTypes, hostAddresses.ToArray()); var ifaceInfos = this.OnGetServiceContractInterfaces(serviceType); foreach (var ifaceInfo in ifaceInfos) { // web service host RESTFulAttribute restFul = (from c in ifaceInfo.ContractType.GetCustomAttributes(true) where c.ToString() == typeof(RESTFulAttribute).ToString() select c).FirstOrDefault() as RESTFulAttribute; if (restFul == null) { // tcp if (hasTcp) { _host.AddServiceEndpoint(ifaceInfo.ContractType, bindingTcp, string.Empty); Log.Info("Service Endpoint (Tcp) added for " + ifaceInfo.ContractType.FullName); } // http if (hasHttp) { _host.AddServiceEndpoint(ifaceInfo.ContractType, bindingHttp, string.Empty); Log.Info("Service Endpoint (Http) added for " + ifaceInfo.ContractType.FullName); } } } if (hasHttp) { ServiceMetadataBehavior metadataBehavior = _host.Description.Behaviors.Find <ServiceMetadataBehavior>(); if (metadataBehavior != null) { metadataBehavior.HttpGetEnabled = true; metadataBehavior.HttpGetUrl = httpUri; } } } // rest service if (hasWebHttp && (serviceTypeRest != null)) { var ifaceInfos = this.OnGetServiceContractInterfaces(serviceTypeRest); foreach (var ifaceInfo in ifaceInfos) { // web service host RESTFulAttribute restFul = (from c in ifaceInfo.ContractType.GetCustomAttributes(true) where c.ToString() == typeof(RESTFulAttribute).ToString() select c).FirstOrDefault() as RESTFulAttribute; if (restFul == null) { restFul = (from a in ifaceInfo.ContractType.GetInterfaces() from c in a.GetCustomAttributes(true) where c.ToString() == typeof(RESTFulAttribute).ToString() select c).FirstOrDefault() as RESTFulAttribute; } if (restFul != null) { // web service host if (_hostWeb == null) { _hostWeb = this.OnCreateWebServiceHost(_serverInstanceRest, knownTypesRest, new Uri[] { }); } // http Uri webUri = new Uri(Path.Combine(httpUriWeb.AbsoluteUri, ifaceInfo.ContractAttribute.Name)); _hostWeb.AddServiceEndpoint(ifaceInfo.ContractType, bindingWebHttp, webUri); Log.Info("Service Endpoint (WebHttp) added for " + ifaceInfo.ContractType.FullName); } } } // Mex endpoings if (hasTcp) { _host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex"); Log.Info("Mex Service Endpoint (Tcp) added"); } if (hasHttp) { _host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex"); Log.Info("Mex Service Endpoint (Http) added"); } // mex endpoint is not required for web http, so please don't uncomment this line if (_hostWeb != null) { //_hostWeb.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), // "mex"); } } } } // default service host try { if (_host != null && _host.State == CommunicationState.Created) { _host.Open(); _mreShutdown.Reset(); if (_serverInstance is IListener) { ((IListener)_serverInstance).Start(); } result = true; } } catch (Exception ex) { Log.Exception(PROC, ex); } // web service host if (result && (_hostWeb != null)) { try { if (_hostWeb != null && _hostWeb.State == CommunicationState.Created) { _hostWeb.Open(); if (_serverInstanceRest is IListener) { ((IListener)_serverInstanceRest).Start(); } result = true; } } catch (Exception ex) { Log.Exception(PROC, ex); } } } catch (Exception ex) { Log.Exception(PROC, ex); } return(result); }
public static Binding CreateTcpBinding() { NetTcpBinding binding = ContractBindingsHelper.CreateTcpBinding(); return(binding); }