GetIsNetworkAvailable() 的行为会因.NET版本而异

后端开发 2026-07-12

我们有一个项目使用如下函数调用:

var isNetworkAvailable = NetworkInterface.GetIsNetworkAvailable();

在一台Windows 11 LTSC(W11 IoT Enterprise LTSC)测试单元上,未连接网络(以太网网线已拔出,Wi-Fi未连接)。

  • 当项目使用.NET 8.0构建时,函数 GetIsNetworkAvailable() 返回 false
  • 当项目使用.NET 9.0构建时,函数 GetIsNetworkAvailable() 返回 true

以下是Microsoft支持对 GetIsNetworkAvailable() 为什么在不同.NET版本下表现不同的解释:

https://learn.microsoft.com/en-gb/answers/questions/5763874/getisnetworkavailable()-behaves-differently-depend

我们希望在使用.NET 9.0构建项目时,保持.NET 8.0的函数行为。是否有等效的代码可以替换函数 GetIsNetworkAvailable()?谢谢。

解决方案

先说说原因。这次 PR 导致 NetworkInterface.GetAllNetworkInterfaces 方法返回了一些NDIS接口,其中一些其实并未连接,但它们的OperationalStatus始终为Up。

所以这在Windows上才会成为问题。我想到5 种解决办法:

  1. 使用Windows API GetAdaptersAddresses,但不要传入 GAA_FLAG_INCLUDE_ALL_INTERFACES 标志,以获得与.NET8相同的结果。
  2. 对由 GetAllNetworkInterfaces 返回的现有结果进行进一步筛选。你可以检查接口是否支持IPv4、是否有物理地址、网关或单播地址:

bool isNetworkReallyAvailable = NetworkInterface .GetAllNetworkInterfaces() .Any(ni => ni.OperationalStatus == OperationalStatus.Up && ni.NetworkInterfaceType != NetworkInterfaceType.Loopback && ni.NetworkInterfaceType != NetworkInterfaceType.Tunnel && // Choose one (ni.Supports(NetworkInterfaceComponent.IPv4) || ni.GetPhysicalAddress().Equals(PhysicalAddress.None) || ni.GetIPProperties().GatewayAddresses.Count > 0 || ni.GetIPProperties().UnicastAddresses.Count > 0) ); 3.你可以移除那些接口:https://superuser.com/questions/1257859/remove-an-unused-hidden-network-connection-so-that-an-existing-name-can-bereuse 4.切换回.NET8,在GitHub上提一个issue,等待后续版本来修复。 5.考虑使用其他方法,例如 这个这个,以及 这个

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章