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 R22016 工作正常。 即使只包含共享库的程序集,没有声明实际实例或进行引用,甚至没有 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 库重命名为其他名称,然后重试。