DNS 解析仅在 Windows 2012 R2 上失败
DNS Resolution failure only on Windows 2012 R2
我遇到了一个非常奇怪的错误,我已将其缩小到特定情况,但由于潜在的影响,我需要尝试找出原因。
为 .NET 4.7.2
构建的应用程序 A v 1.0 在 Windows Server 2012 R2
上运行良好
应用程序 A v 2.0 也为 .NET 4.7.2
构建,但现在使用 .Net Standard 2.0
共享库突然导致 tcp 堆栈失败(特别是所有 DNS 解析失败,甚至内部目的地)
此错误仅发生在 2012 R2
。 2016
工作正常。
即使只包含共享库的程序集,没有声明实际实例或进行引用,甚至没有 using 语句,也会出现此错误,只是在依赖项中包含共享库会导致此错误。
应用程序外部 DNS 解析工作正常。
FusionLogs 在我的 Windows 10 machine
上加载的内容和在 2012 R2
上加载的内容在功能上是相同的。唯一的区别是加载的本机图像的编码文件夹名称。
这是共享库中所有相关依赖项的列表
BouncyCastle.Crypto v 1.8.5:
Org.BouncyCastle.Crypto.Parameters;
Org.BouncyCastle.OpenSsl;
Org.BouncyCastle.Security;
Common.Logging v 3.4.1:
DnsClient v 1.2.0:
Microsoft.CSharp v 4.7.0:
Mimekit v 2.4.1:
NewtonSoft.Json v 12.0.1:
System v 4.0.0.0:
System.Collections.Generic;
System.Collections.Concurrent;
System.IO;
System.IO.Compression.FileSystem;
System.Drawing;
System.Numerics;
System.Runtime.Serialization;
System.Net;
System.Net.Http;
System.Net.Http.Headers;
System.Security.Cryptography;
System.Text;
System.Threading;
System.Threading.Tasks;
System.Xml;
异常:
17:16:21 [1] [Info] - DNS Query against 'google.com'
Unhandled Exception: System.Net.Sockets.SocketException: No such host is known
at System.Net.Dns.GetAddrInfo(String name)
at System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6)
at System.Net.Dns.GetHostEntry(String hostNameOrAddress)
at DNSAPITestApp.Tester..ctor() in ...
at DNSAPITestApp.Program.Main(String[] args) in ...
我在网上进行了广泛搜索,但是有太多类似 DNS 问题的白噪声仍然与这个特定场景或为什么会发生这种情况无关(以及如何确认任何理论同样重要)。
如有任何帮助,我们将不胜感激。我不能 post 大部分代码,但如果有任何特定区域使用了特定的依赖项,任何人都希望看到我可以添加片段。
答案归功于 MSDN
的 CoolDadTx
库名称是问题所在。当您编译该库时,它是 DnsApi.dll。这恰好与包含 DNS 本机逻辑的 Windows DLL 同名。当它尝试加载系统 DLL 时,它会找到你的,因为它首先搜索应用程序目录,然后尝试使用它,但是,当然,它不起作用。
将 class 库重命名为其他名称,然后重试。
我遇到了一个非常奇怪的错误,我已将其缩小到特定情况,但由于潜在的影响,我需要尝试找出原因。
为 .NET 4.7.2
构建的应用程序 A v 1.0 在 Windows Server 2012 R2
上运行良好
应用程序 A v 2.0 也为 .NET 4.7.2
构建,但现在使用 .Net Standard 2.0
共享库突然导致 tcp 堆栈失败(特别是所有 DNS 解析失败,甚至内部目的地)
此错误仅发生在 2012 R2
。 2016
工作正常。
即使只包含共享库的程序集,没有声明实际实例或进行引用,甚至没有 using 语句,也会出现此错误,只是在依赖项中包含共享库会导致此错误。
应用程序外部 DNS 解析工作正常。
FusionLogs 在我的 Windows 10 machine
上加载的内容和在 2012 R2
上加载的内容在功能上是相同的。唯一的区别是加载的本机图像的编码文件夹名称。
这是共享库中所有相关依赖项的列表
BouncyCastle.Crypto v 1.8.5:
Org.BouncyCastle.Crypto.Parameters;
Org.BouncyCastle.OpenSsl;
Org.BouncyCastle.Security;
Common.Logging v 3.4.1:
DnsClient v 1.2.0:
Microsoft.CSharp v 4.7.0:
Mimekit v 2.4.1:
NewtonSoft.Json v 12.0.1:
System v 4.0.0.0:
System.Collections.Generic;
System.Collections.Concurrent;
System.IO;
System.IO.Compression.FileSystem;
System.Drawing;
System.Numerics;
System.Runtime.Serialization;
System.Net;
System.Net.Http;
System.Net.Http.Headers;
System.Security.Cryptography;
System.Text;
System.Threading;
System.Threading.Tasks;
System.Xml;
异常:
17:16:21 [1] [Info] - DNS Query against 'google.com'
Unhandled Exception: System.Net.Sockets.SocketException: No such host is known
at System.Net.Dns.GetAddrInfo(String name)
at System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6)
at System.Net.Dns.GetHostEntry(String hostNameOrAddress)
at DNSAPITestApp.Tester..ctor() in ...
at DNSAPITestApp.Program.Main(String[] args) in ...
我在网上进行了广泛搜索,但是有太多类似 DNS 问题的白噪声仍然与这个特定场景或为什么会发生这种情况无关(以及如何确认任何理论同样重要)。
如有任何帮助,我们将不胜感激。我不能 post 大部分代码,但如果有任何特定区域使用了特定的依赖项,任何人都希望看到我可以添加片段。
答案归功于 MSDN
的 CoolDadTx库名称是问题所在。当您编译该库时,它是 DnsApi.dll。这恰好与包含 DNS 本机逻辑的 Windows DLL 同名。当它尝试加载系统 DLL 时,它会找到你的,因为它首先搜索应用程序目录,然后尝试使用它,但是,当然,它不起作用。
将 class 库重命名为其他名称,然后重试。