我一直试图找到一种方法来确定此示例中的字符串,主机名是否确实是有效的主机名,并且可以解析为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而不按照我的方式进行操作?我无法找到避免可怕表现的方法。
对不起,如果我的问题不清楚,这是我第一次在这个网站上被问到这个问题!
答案 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