GetIsNetworkAvailable() 的行为会因.NET版本而异
我们有一个项目使用如下函数调用:
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版本下表现不同的解释:
我们希望在使用.NET 9.0构建项目时,保持.NET 8.0的函数行为。是否有等效的代码可以替换函数 GetIsNetworkAvailable()?谢谢。
解决方案
先说说原因。这次 PR 导致 NetworkInterface.GetAllNetworkInterfaces 方法返回了一些NDIS接口,其中一些其实并未连接,但它们的OperationalStatus始终为Up。
所以这在Windows上才会成为问题。我想到5 种解决办法:
- 使用Windows API
GetAdaptersAddresses,但不要传入GAA_FLAG_INCLUDE_ALL_INTERFACES标志,以获得与.NET8相同的结果。 - 对由
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.考虑使用其他方法,例如 这个、这个,以及 这个。