public static IList <IProxyChannel <TContractType> > CreateProxyChannels <TContractType>() where TContractType : class { List <IProxyChannel <TContractType> > list = null; IList <ServiceEndpoint> endpoints = EndpointProvider.GetEndpoints <TContractType>(); if (endpoints != null && endpoints.Count > 0) { list = new List <IProxyChannel <TContractType> >(); foreach (ServiceEndpoint endpoint in endpoints) { list.Add(new ProxyChannel <TContractType>(endpoint, null)); } } return(list); }
public GetServicesResponse GetServices(GetServicesRequest request) { try { if (request == null) { throw new ArgumentNullException("request"); } GetServicesResponse response = new GetServicesResponse(); response.Services = new List <ServiceData>(); Type contractType = (from c in contracts where c.ContractType.FullName == request.ServiceName select c.ContractType).FirstOrDefault(); if (contractType != null) { IList <ServiceEndpoint> endpoints = EndpointProvider.GetEndpoints(contractType); foreach (var endpoint in endpoints) { ServiceData service = new ServiceData() { Name = endpoint.Name, ContractName = endpoint.Contract.ContractType.FullName, Binding = endpoint.Binding.Name, Address = endpoint.Address.Uri.ToString(), HostName = endpoint.ListenUri.Host, Uri = endpoint.ListenUri, }; response.Services.Add(service); } } return(response); } catch (Exception ex) { throw new FaultException <ServiceDiscoveryServiceFault>(new ServiceDiscoveryServiceFault(ex.Message, ex), ex.Message); } }
/// <summary> /// 获取指定服务契约类型的所有通道连接 /// </summary> /// <typeparam name="TContract">服务契约类型</typeparam> /// <returns>指定服务契约类型的所有通道连接</returns> public IList <TContract> GetChannels <TContract>() where TContract : class { List <TContract> list = new List <TContract>(); IList <ServiceEndpoint> endpoints = EndpointProvider.GetEndpoints <TContract>(); List <IProxyChannelManager <TContract> > channelManagerList = new List <IProxyChannelManager <TContract> >(); List <ServiceEndpoint> channelExistEndpoints = new List <ServiceEndpoint>(); List <object> proxyChannelManagers = new List <object>(_proxyChannelManagerContainer.Values); foreach (var item in proxyChannelManagers) { if (item is ProxyChannelManager <TContract> ) { IProxyChannelManager <TContract> channelManager = item as IProxyChannelManager <TContract>; if (channelManager != null) { channelManagerList.Add(channelManager); foreach (ServiceEndpoint endpoint in endpoints) { if (endpoint.Address.Uri.Host == channelManager.ContractInfo.HostName) { channelExistEndpoints.Add(endpoint); break; } } } } } foreach (ServiceEndpoint endpoint in channelExistEndpoints) { endpoints.Remove(endpoint); } if (endpoints.Count > 0) { // create proxy channel manager for those endpoints who have not been created foreach (ServiceEndpoint endpoint in endpoints) { ContractInfo contract = new ContractInfo(typeof(TContract), endpoint.Address.Uri.Host); IProxyChannelManager <TContract> proxyChannelManager = GetProxyChannelManager <TContract>(contract.Key); if (proxyChannelManager == null) { lock (_proxyChannelManagerContainerLocker) { proxyChannelManager = GetProxyChannelManager <TContract>(contract.Key); if (proxyChannelManager == null) { proxyChannelManager = ProxyChannelManagerFactory.Create <TContract>(contract); RegisterProxyChannelManager(proxyChannelManager, contract.Key); } } } if (proxyChannelManager != null) { channelManagerList.Add(proxyChannelManager); } } } foreach (ProxyChannelManager <TContract> channelManager in channelManagerList) { list.Add(channelManager.GetChannel()); } return(list); }