方法避免SocketException尝试/ catch?

时间:2015-05-21 21:08:14

标签: c# .net dns host

我一直试图找到一种方法来确定此示例中的字符串,主机名是否确实是有效的主机名,并且可以解析为IP。我在C#中使用DNS类,并使用函数:

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而不按照我的方式进行操作?我无法找到避免可怕表现的方法。

对不起,如果我的问题不清楚,这是我第一次在这个网站上被问到这个问题!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-1)

你在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