避免 SocketException try/catch 的方法?

Way to avoid SocketException try/catch?

我一直在努力寻找一种方法来确定一个字符串,一个主机名,在这个例子中,是否确实是一个有效的主机名并且可以解析为一个 IP。我在 C# 中使用 DNS class,并使用函数:

Dns.GetHostEntry(hostname)

但是,如果此函数失败,它会抛出 SocketException 错误,并且对于我必须处理的字符串列表,这些异常可能会经常发生。我创建了一个如下所示的 try/catch 来处理这个问题:

public List<string> fetchIP(string hostname)
{
    try
    {
        List<string> theIPs = new List<string>();
        IPHostEntry entry = Dns.GetHostEntry(hostname);
        foreach (IPAddress ipAddress in entry.AddressList)
        {
            theIPs.Add(ipAddress.ToString());
        }
        return theIPs;
    }
    catch (System.Net.Sockets.SocketException)
    {
        return null;
    }   
}

现在的问题是...运行速度很慢。由于失败的 GetHostEntry() 次调用,该页面目前平均需要 10 多秒才能加载。有没有办法知道主机名是否可以解析为 IP,而无需像我那样做?我找不到避免糟糕表现的方法。

抱歉,如果我的问题不清楚,这是我第一次在这个网站上提问!

你 运行 是 4.5 吗?您可以尝试 Uri.CheckHostName 方法。

Console.WriteLine(Uri.CheckHostName("www.google.com"));

https://msdn.microsoft.com/en-us/library/system.uri.checkhostname(v=vs.110).aspx

解析主机名通常是一个耗时的过程。如果答案尚未缓存,则完全解析主机名不可避免地会成为远程 DNS 服务器响应时间的瓶颈。您最好的选择是 运行 能够立即响应(并缓存以前的请求)的本地 DNS 服务器,或者在您的代码中维护缓存。

无论哪种方式,未命中缓存的新请求都将花费很长时间。一种缓解措施是使用您希望发生的请求预填充您的 DNS 服务器。如何做到这一点超出了这个问题的范围。