You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:17:57