我在文档中找不到任何适当的描述来说明这实际上是做什么的。
它是否检查是否存在 A 记录或 CNAME 记录或两者都存在?
我的理解是,在 .NET 4 中,如果主机不存在,则会引发 SocketException,这已通过我的测试得到证实。
我在文档中找不到任何适当的描述来说明这实际上是做什么的。
它是否检查是否存在 A 记录或 CNAME 记录或两者都存在?
我的理解是,在 .NET 4 中,如果主机不存在,则会引发 SocketException,这已通过我的测试得到证实。
Dns.GetHostEntry
构建在 Windows API 之上,不直接使用 DNS 协议。如果启用 IPv6,它将调用getaddrinfo
. 否则它会调用gethostbyaddr
. 这些函数可以使用本地%SystemRoot%\System32\drivers\etc\hosts
文件、DNS 甚至 NETBIOS 将主机名解析为 IP 地址。使用 DNS 将主机名解析为 IP 地址将使用 CNAME 记录来查找 A 记录。
您可以通过解决www.google.com
至少现在有一个 CNAME 记录指向www.l.google.com
. UsingDns.GetHostEntry
将返回 A 记录中的 IP 地址www.l.google.com
。
这是由返回的地址列表
var ips = System.Net.Dns.GetHostEntry("microsoft.com").AddressList;
foreach (var ip in ips)
Console.WriteLine(ip);
// output
64.4.11.37
65.55.58.201
这些是从 network-tools.com,DNS 查询中提取的 A 记录。
Answer records
microsoft.com A 64.4.11.37
microsoft.com A 65.55.58.201
所以我会说它确实拉了A记录。
在这里要明确地说,Martin Liversage 的答案是最正确的答案。该 api 将首先尝试定位正在解析的域的 CNAME 记录。如果找到 CNAME 记录,则 api 将尝试解析从 CNAME 记录返回的域的 A 记录。如果正在解析的域没有 CNAME 记录,那么它将尝试解析域本身的 A 记录。
要检测 CNAME 记录何时存在,可以根据输入主机名检查解析的主机名。例子:
IPHostEntry iphostEntry = Dns.GetHostEntry(inputHostname);
if (iphostEntry.Hostname != inputHostname) {
Console.WriteLine("CNAME record exists pointing {0} to {1}", inputHostname, iphostEntry.Hostname);
Console.WriteLine("iphostEntry.AddressList values are the A record values of {0}", iphostEntry.Hostname);
} else {
Console.WriteLine("CNAME record does NOT exist for {0}", inputHostname);
Console.WriteLine("iphostEntry.AddressList values are the A record values of {0}", inputHostname);
}