示例#1
0
        /// <summary>
        /// Adds contact points as hosts and resolving host names if necessary.
        /// </summary>
        /// <exception cref="NoHostAvailableException">When no host can be resolved and no other contact point is an address</exception>
        private async Task AddHosts(IEnumerable <object> contactPoints)
        {
            var resolvedContactPoints = new Dictionary <string, ICollection <IPEndPoint> >();
            var hostNames             = new List <string>();

            foreach (var contactPoint in contactPoints)
            {
                if (contactPoint is IPEndPoint endpoint)
                {
                    resolvedContactPoints.CreateOrAdd(endpoint.ToString(), endpoint);
                    _metadata.AddHost(endpoint);
                    continue;
                }

                if (!(contactPoint is string contactPointText))
                {
                    throw new InvalidOperationException("Contact points should be either string or IPEndPoint instances");
                }

                if (IPAddress.TryParse(contactPointText, out var ipAddress))
                {
                    var ipEndpoint = new IPEndPoint(ipAddress, Configuration.ProtocolOptions.Port);
                    resolvedContactPoints.CreateOrAdd(contactPointText, ipEndpoint);
                    _metadata.AddHost(ipEndpoint);
                    continue;
                }

                hostNames.Add(contactPointText);
                IPHostEntry hostEntry = null;
                try
                {
                    hostEntry = await Dns.GetHostEntryAsync(contactPointText).ConfigureAwait(false);
                }
                catch (Exception)
                {
                    _logger.Warning($"Host '{contactPointText}' could not be resolved");
                }

                if (hostEntry != null && hostEntry.AddressList.Length > 0)
                {
                    foreach (var resolvedAddress in hostEntry.AddressList)
                    {
                        var ipEndpoint = new IPEndPoint(resolvedAddress, Configuration.ProtocolOptions.Port);
                        _metadata.AddHost(ipEndpoint);
                        resolvedContactPoints.CreateOrAdd(contactPointText, ipEndpoint);
                    }
                }
                else
                {
                    resolvedContactPoints.CreateIfDoesNotExist(contactPointText);
                }
            }

            _metadata.SetResolvedContactPoints(resolvedContactPoints.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.AsEnumerable()));

            if (_metadata.Hosts.Count == 0)
            {
                throw new NoHostAvailableException($"No host name could be resolved, attempted: {string.Join(", ", hostNames)}");
            }
        }