コード例 #1
0
        public List <string> GetIpV4Addresses(string scheme)
        {
            List <string> results = new List <string>();
            // get IP address instead of hostname for addresses
            string hostIpv4 = null;

            foreach (IPAddress ipAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
            {
                if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
                {
                    hostIpv4 = ipAddress.ToString();
                }
            }
            if (hostIpv4 == null)
            {
                throw new Exception("Unable to resolve host name to IPV4 address!");
            }
            foreach (EndpointData ep in _endpoints)
            {
                if (scheme == null || ep.Scheme.ToLower() == scheme.ToLower())
                {
                    results.Add(WcfHelper.FormatAddress(ep.Scheme, hostIpv4, ep.Port, _applName, _intfName));
                }
            }
            return(results);
        }
コード例 #2
0
        private static bool QueryService(ILogger logger, string host, int port, string serviceName,
                                         string[] requiredContracts, int maxRoundTrips, out Int64 bestRoundTrip)
        {
            bestRoundTrip = TimeSpan.FromSeconds(30).Ticks;
            AddressBinding addressBinding = WcfHelper.CreateAddressBinding(
                WcfConst.NetTcp, host, port, serviceName, typeof(IDiscoverV111).Name);

            try
            {
                using (var client = new DiscoverSenderV111(addressBinding))
                {
                    // query service n times to find best round trip
                    int loop = 0;
                    while (loop < maxRoundTrips)
                    {
                        DateTimeOffset    clientTime1 = DateTimeOffset.Now;
                        V111DiscoverReply reply       = client.DiscoverServiceV111();
                        // fail if server does not support required contracts
                        if (requiredContracts != null)
                        {
                            foreach (string requiredContract in requiredContracts)
                            {
                                if (reply.SupportedContracts == null)
                                {
                                    logger.LogDebug("Server ({0}) does not support contract: '{1}'", addressBinding.Address.Uri.AbsoluteUri, requiredContract);
                                    return(false);
                                }
                                bool supportsContract = false;
                                foreach (string supportedContract in reply.SupportedContracts)
                                {
                                    if (supportedContract == requiredContract)
                                    {
                                        supportsContract = true;
                                    }
                                }
                                if (!supportsContract)
                                {
                                    logger.LogDebug("Server ({0}) does not support contract: '{1}'", addressBinding.Address.Uri.AbsoluteUri, requiredContract);
                                    return(false);
                                }
                            }
                        }
                        // all required contracts supported
                        DateTimeOffset clientTime2 = DateTimeOffset.Now;
                        Int64          roundTrip   = clientTime2.Ticks - clientTime1.Ticks;
                        if ((roundTrip >= 0) && (roundTrip < bestRoundTrip))
                        {
                            bestRoundTrip = roundTrip;
                        }
                        // loop
                        loop++;
                    }
                    //logger.LogDebug("Server ({0}) answered ({1} ticks)", addressBinding.Address.Uri.AbsoluteUri, bestRoundTrip);
                    return(true);
                }
            }
            catch (EndpointNotFoundException)
            {
                //logger.LogDebug("Server ({0}) not answering.", addressBinding.Address.Uri.AbsoluteUri);
                return(false);
            }
            catch (CommunicationObjectFaultedException)
            {
                //logger.LogDebug("Server ({0}) not answering.", addressBinding.Address.Uri.AbsoluteUri);
                return(false);
            }
            //catch (Exception excp)
            //{
            //    logger.LogError("Server ({0}) threw exception: {1}", addressBinding.Address.Uri.AbsoluteUri, excp);
            //    return false;
            //}
        }
コード例 #3
0
 public AddressBinding(string uri, int limitMultiplier, TimeSpan msgLifetime)
 {
     Address = new EndpointAddress(uri);
     Binding = WcfHelper.CreateBinding(WcfHelper.GetSchemeFromAddress(Address), limitMultiplier, msgLifetime);
 }
コード例 #4
0
        public CustomServiceHost(
            ILogger logger, S serviceImpl, string endpoints, string applName, string intfName,
            bool multiThreaded)
            : base(serviceImpl)
        {
            int      limitMultiplier = WcfConst.LimitMultiplier;
            TimeSpan msgLifetime     = WcfConst.ExpressMsgLifetime;

            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
            if (endpoints == null)
            {
                throw new ArgumentNullException(nameof(endpoints));
            }
            string[] endpointsParts = endpoints.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            if (endpointsParts.Length == 0)
            {
                throw new ArgumentNullException(nameof(endpoints));
            }
            _endpoints = new EndpointData[endpointsParts.Length];
            for (int i = 0; i < _endpoints.Length; i++)
            {
                _endpoints[i] = new EndpointData(endpointsParts[i]);
            }
            _applName = applName ?? throw new ArgumentNullException(nameof(applName));
            _intfName = intfName ?? throw new ArgumentNullException(nameof(intfName));
            // add standard behaviour
            ServiceBehaviorAttribute serviceBehavior = Description.Behaviors.Find <ServiceBehaviorAttribute>();

            if (serviceBehavior == null)
            {
                serviceBehavior = new ServiceBehaviorAttribute();
                Description.Behaviors.Add(serviceBehavior);
            }
            // exception handling
            serviceBehavior.IncludeExceptionDetailInFaults = true;
            // multi-threading singleton mode
            serviceBehavior.UseSynchronizationContext = false;
            serviceBehavior.InstanceContextMode       = InstanceContextMode.Single;
            serviceBehavior.ConcurrencyMode           = multiThreaded ? ConcurrencyMode.Multiple : ConcurrencyMode.Single;
            // add endpoints
            string httpAddress = null;

            foreach (var endpoint in _endpoints)
            {
                endpoint.Binding = WcfHelper.CreateBinding(endpoint.Scheme, limitMultiplier, msgLifetime);
                endpoint.Address = WcfHelper.FormatAddress(endpoint.Scheme, null, endpoint.Port, _applName, _intfName);
                // save http base address for metadata behaviour setup (below)
                if (endpoint.Scheme == WcfConst.Http)
                {
                    httpAddress = endpoint.Address;
                }
                endpoint.Endpoint = AddServiceEndpoint(typeof(T), endpoint.Binding, endpoint.Address);
                if (endpoint.Scheme == WcfConst.NetMsmq)
                {
                    endpoint.QueueName = WcfHelper.FormatQueueName(_applName, endpoint.Port, _intfName);
                }
                //_Logger.LogDebug("{1}: Added service endpoint: {0}", _Endpoints[i].Endpoint.Address, this.GetType().Name);
            }
            // add metadata behaviour (if HTTP endpoint exists)
            ServiceMetadataBehavior metadataBehavior = Description.Behaviors.Find <ServiceMetadataBehavior>();

            if ((metadataBehavior == null) && (httpAddress != null))
            {
                metadataBehavior = new ServiceMetadataBehavior
                {
                    HttpGetEnabled = true,
                    HttpGetUrl     = new Uri(httpAddress)
                };
                Description.Behaviors.Add(metadataBehavior);
                _logger.LogDebug("Added MEX for endpoint: {0}", httpAddress);
            }
            // ready to open
            Open();
            if (State != CommunicationState.Opened)
            {
                throw new Exception($"ServiceHost State ({State}) <> Opened!");
            }
            //_Logger.LogDebug("ServiceHost State: {0}", this.State);
        }