C# 避免SocketException的方法try/catch?

C# 避免SocketException的方法try/catch?,c#,.net,dns,host,C#,.net,Dns,Host,我一直在试图找到一种方法来确定一个字符串,一个主机名,在这个例子中,是否确实是一个有效的主机名,并且可以解析为IP。我正在使用C#中的DNS类,并使用以下函数: Dns.GetHostEntry(hostname) 但是,如果这个函数失败,它会抛出一个SocketException错误,在我必须处理的字符串列表中,这些异常会经常发生。我创建了一个try/catch(如下所示)来处理此问题: public List<string> fetchIP(string hostname) {

我一直在试图找到一种方法来确定一个字符串,一个主机名,在这个例子中,是否确实是一个有效的主机名,并且可以解析为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;
    }   
}
公共列表fetchIP(字符串主机名)
{
尝试
{
List theIPs=新列表();
IPHostEntry条目=Dns.GetHostEntry(主机名);
foreach(条目中的IPAddress IPAddress.AddressList)
{
添加(ipAddress.ToString());
}
归还他们的护照;
}
捕获(System.Net.Sockets.SocketException)
{
返回null;
}   
}
现在的问题是。。。这个跑得很慢。由于
GetHostEntry()
调用失败,页面当前平均加载时间超过10秒。有没有办法知道主机名是否可以解析为IP而不必像我这样做?我找不到避免糟糕表现的方法


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

你是在跑4.5吗?您可以尝试Uri.CheckHostName方法

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

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


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

嗯,drat-现在我读了更多关于它的内容,它实际上并没有DNS查找主机,只是检查有效的格式:(