/// <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)}"); } }