.NET 9环境下如何让GetIsNetworkAvailable()保持.NET 8的行为?
.NET 9环境下如何让GetIsNetworkAvailable()保持.NET 8的行为?
我完全懂你的需求——升级到.NET 9后,原来依赖的GetIsNetworkAvailable()判断逻辑变了,你就想保留.NET 8里的严格校验,避免框架版本升级导致业务逻辑出问题。
直接给你上可以替代的代码,这个方法1:1复刻了.NET 8中GetIsNetworkAvailable()的核心判断逻辑:
using System.Net.NetworkInformation; public static class NetworkHelper { public static bool GetIsNetworkAvailableNet8Behavior() { foreach (NetworkInterface networkInterface in NetworkInterface.GetAllNetworkInterfaces()) { // 跳过环回、隧道这类虚拟接口 if (networkInterface.NetworkInterfaceType is NetworkInterfaceType.Loopback or NetworkInterfaceType.Tunnel) { continue; } // 接口必须处于启用(正常运行)状态 if (networkInterface.OperationalStatus != OperationalStatus.Up) { continue; } // 检查接口是否持有有效单播IP(排除未分配的0.0.0.0/::这类占位地址) IPInterfaceProperties ipProps = networkInterface.GetIPProperties(); foreach (UnicastIPAddressInformation unicastIp in ipProps.UnicastAddresses) { IPAddress ip = unicastIp.Address; if (!IPAddress.IsLoopback(ip) && !ip.Equals(IPAddress.Any) && !ip.Equals(IPAddress.IPv6Any)) { return true; } } } return false; } }
为什么这个代码能还原.NET 8的行为?
.NET 9对GetIsNetworkAvailable()的底层实现做了调整,会把一些虚拟接口、未实际连接的接口也算作“网络可用”;但.NET 8的逻辑更严谨:只承认非环回、非隧道、已启用、且拥有有效单播IP地址的真实网络接口。上面的自定义方法完全遵循这个严格标准,所以在无网络的Win11 IoT LTSC设备上,会和.NET 8一样返回false。
你只需要把原来调用NetworkInterface.GetIsNetworkAvailable()的地方,替换成NetworkHelper.GetIsNetworkAvailableNet8Behavior()就可以了,彻底摆脱框架版本差异的影响。
备注:内容来源于stack exchange,提问作者Ming
相关产品推荐
相关产品推荐

