예제 #1
0
        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);
            }
        }
예제 #3
0
        /// <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);
        }