我想要发生的事情:将域的方法作为字符串传递,并在域解析时返回true。如果没有,则为假。基本目标是查看域是否存在。
会发生什么:大多数有效的域字符串都返回true。但是,尽管使用nslookup进行了解析,但有些会返回false。
我不明白为什么某些域在使用命令提示符nslookup和nslookup站点时看起来很好而无法解决。 (我使用了https://centralops.net/,http://www.kloth.net/services/nslookup.php和http://network-tools.com/nslook/)
方法(C#):
//no blank domains
public bool CheckDomain(string sDomain)
{
if (string.IsNullOrWhiteSpace(sDomain)) return false;
for (int i = 1; i <= mQueryRetry; i++)
{
try
{
System.Net.IPAddress dnsCli = System.Net.IPAddress.Parse("8.8.8.8")
DnsClient myClient = new DnsClient(dnsCli);
DnsMessage dnsMessage = myClient.Resolve(ARSoft.Tools.Net.DomainName.Parse(sDomain), RecordType.A);
if ((dnsMessage == null) || ((dnsMessage.ReturnCode != ReturnCode.NoError) && (dnsMessage.ReturnCode != ReturnCode.NxDomain)))
{
throw new Exception("DNS request failed");
}
else
{
foreach (DnsRecordBase dnsRecord in dnsMessage.AnswerRecords)
{
ARecord aRecord = dnsRecord as ARecord;
if (aRecord != null)
{
return true;
}
}
}
}
catch (Exception ex)
{
// Back off and try again after 1 seconds
if (i != mQueryRetry)
{
System.Threading.Thread.Sleep(1000);
}
else
{
System.Diagnostics.Trace.WriteLine(string.Format("Domain: {0} error: {1}", sDomain, ex.Message));
}
}
}
System.Diagnostics.Trace.Flush();
return false;
}
如果您打算对其进行测试,我建议将dnsCli
IP地址替换为one of these.我已经将谷歌DNS服务器的IP留在那里作为示例,但我正在使用我的公司& #39;我的生产代码中的DNS服务器。我发现更改DNS服务器决不会影响方法的行为。
我对DnsClient
,DnsMessage
,DomainName
,DnsRecordBase
和{{1}使用最新版本的Arsoft.Tools.Net(2.2.8) ,类/对象。我们在旧版本(1.8.1)中遇到了同样的问题。
一些未能解决的域名是:
ARecord
其他信息:我已经尝试了一些非常长的查询超时限制,超过5分钟,并且它们没有任何区别。因此,我确信这不是暂停问题。
答案 0 :(得分:2)
&#34;您可以尝试使用不同的库,即DnsClient(nuget),请参阅dnsclient.michaco.net。有问题的域名似乎工作得很好&#34; - @MichaC
问题实际上是我正在使用的Arsoft.Tools.Net库。切换到DnsClient.Net修复了问题。