private void CreateMetadataBehavior(SpringServiceHost ssh, ServiceMetadataBehavior smb, ServiceEndpointElement metadataEle) { if (smb == null) { smb = new ServiceMetadataBehavior(); if (ssh.BaseAddresses.Any(o => o.Scheme.ToLower() == Uri.UriSchemeHttp)) { smb.HttpGetEnabled = true; } ssh.Description.Behaviors.Add(smb); } foreach (var baseAddress in ssh.BaseAddresses) { //BindingElement bindingElement = null; Binding bindingElement = null; switch (baseAddress.Scheme) { case "net.tcp": { bindingElement = MetadataExchangeBindings.CreateMexTcpBinding(); //bindingElement = new TcpTransportBindingElement(); break; } case "net.pipe": { bindingElement = MetadataExchangeBindings.CreateMexNamedPipeBinding(); //bindingElement = new NamedPipeTransportBindingElement(); break; } case "http": { bindingElement = MetadataExchangeBindings.CreateMexHttpBinding(); //bindingElement = new HttpTransportBindingElement(); break; } case "https": { bindingElement = MetadataExchangeBindings.CreateMexHttpsBinding(); //bindingElement = new HttpsTransportBindingElement(); break; } default: throw new ProtocolException("The base address {0} Unable to identify".FormatString(baseAddress.ToString())); } if (bindingElement != null) { //Binding binding = new CustomBinding(bindingElement); ssh.AddServiceEndpoint(typeof(IMetadataExchange), bindingElement, "MEX"); } } }
/// <summary> /// 根据WCF元数据创建SpringServiceHost列表 /// <code> /// WCFService wcfservice = new WCFService(); /// _container.Add(wm, wcfservice.Builder(wm)); /// </code> /// </summary> /// <param name="serviceMeta">WCF元数据</param> /// <returns>SpringServiceHost列表</returns> public List <SpringServiceHost> Builder(WCFServiceMeta serviceMeta) { WCFServiceMeta = serviceMeta; List <SpringServiceHost> ssh = new List <SpringServiceHost>(); ServiceEndpointElement metaServiceEndpoint = null; try { foreach (ServiceElement service in serviceMeta.ServicesConfiguration.Services) { List <Uri> baseUris = new List <Uri>(); foreach (BaseAddressElement ba in service.Host.BaseAddresses) { baseUris.Add(new Uri(ba.BaseAddress)); } //ServiceHost sh = new System.ServiceModel.ServiceHost(CreateContactType(service.Name), baseUris.ToArray()); //IApplicationContext c = ContextRegistry.GetContext(serviceMeta.ContextName); SpringWebServiceHost sh2 = null; SpringServiceHost sh = null;// new SpringServiceHost(service.Name, serviceMeta.ContextName, baseUris.ToArray()); // SpringWebServiceHost sh = new WebServiceHost() foreach (ServiceEndpointElement see in service.Endpoints) { Type contactType; if (see.Contract == "IMetadataExchange") { //contactType = typeof(IMetadataExchange); metaServiceEndpoint = see; continue; } else { contactType = CreateContactType(see.Contract); } //ContractDescription cd = ContractDescription.GetContract(contactType); Binding binding = WCFMateHelper.BindingFactory(serviceMeta, see); if (binding is WebHttpBinding) { sh2 = new SpringWebServiceHost(service.Name, serviceMeta.ContextName, baseUris.ToArray()); sh2.AddServiceEndpoint(contactType, binding, see.Address); } else { try { sh = new SpringServiceHost(service.Name, serviceMeta.ContextName, baseUris.ToArray()); sh.AddServiceEndpoint(contactType, binding, see.Address); }catch (Exception ex) { throw new Exception(string.Format("创建服务失败,WCF配置中的服务名称{0},不能在容器中获取实例", service.Name), ex.InnerException); } } } try { if (sh2 == null) { ServiceDebugBehavior sdb = sh.Description.Behaviors.Find <ServiceDebugBehavior>(); { if (sdb != null) { sdb.IncludeExceptionDetailInFaults = true; } else { ServiceDebugBehavior sb = new ServiceDebugBehavior(); sb.IncludeExceptionDetailInFaults = true; sh.Description.Behaviors.Add(sb); } } ServiceMetadataBehavior behavior = sh.Description.Behaviors.Find <ServiceMetadataBehavior>(); { CreateMetadataBehavior(sh, behavior, metaServiceEndpoint); } WCFMateHelper.BuildingServiceaBehavior(serviceMeta, service, sh); sh.Faulted += sh_Faulted; sh.UnknownMessageReceived += sh_UnknownMessageReceived; if (sh.State != CommunicationState.Opened) { sh.Open(); } ssh.Add(sh); } else { ServiceDebugBehavior sdb = sh2.Description.Behaviors.Find <ServiceDebugBehavior>(); { if (sdb != null) { sdb.IncludeExceptionDetailInFaults = true; } else { ServiceDebugBehavior sb = new ServiceDebugBehavior(); sb.IncludeExceptionDetailInFaults = true; sh2.Description.Behaviors.Add(sb); } } sh2.Faulted += sh_Faulted; sh2.UnknownMessageReceived += sh_UnknownMessageReceived; if (sh2.State != CommunicationState.Opened) { sh2.Open(); } } } catch (Exception ex) { throw new WCFServiceCreateException(Resources.WCFServiceCreateException, ex); } } } catch (Exception serException) { throw serException; } return(ssh); }