为什么GetIsNetworkAvailable()总是返回true?

我有这个方法:

public static void testConnection() { if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) { System.Windows.MessageBox.Show("This computer is connected to the internet"); } else { System.Windows.MessageBox.Show("This computer is not connected to the internet"); } } 

我想它会告诉我连接是否可用,但是它总是返回true(并且打印第一条消息),即使我确定没有连接。 我做错了什么?

PS:我还在学习C#。

请纠正我,如果我错了,但据我所知,你正在使用的方法是检查网络连接,不一定互联网连接。 我会假设,如果你是在任何类型的网络,这将返回true,无论互联网可用或不? 看到这个

我已经注意到,检查互联网连接的一种方法如下:

 private bool IsInternetAvailable() { try { Dns.GetHostEntry("www.google.com"); //using System.Net; return true; } catch (SocketException ex) { return false; } } 

上面的代码可以在下面的帖子中找到(在VB.Net中,通过阅读Joacim Andersson [MVP]的评论)。

注意:最新的编辑是由AceInfinity提出的,但在社区评论中被拒绝。 我的声誉太低,无法覆盖这个,所以我自己做了改变。

我觉得这个方法比较合适:

  public static bool getIsInternetAccessAvailable() { switch(NetworkInformation.GetInternetConnectionProfile().GetNetworkConnectivityLevel()) { case NetworkConnectivityLevel.InternetAccess: return true; default: return false; } } 

从msdn :

有很多情况下设备或计算机没有连接到有用的网络,但仍被视为可用和GetIsNetworkAvailable将返回true。

其中一个例子可能是你的情况:

例如,如果运行应用程序的设备连接到需要代理的无线网络,但未设置代理,则GetIsNetworkAvailable将返回true。 当GetIsNetworkAvailable将返回true的另一个示例是,如果应用程序正在连接到集线器或路由器(集线器或路由器已丢失上游连接)的计算机上运行。

请注意,我们正在使用Windows.Networking.Connectivity.NetworkInformation而不是System.Net.NetworkInformation命名空间。

  public bool checkInternetAccess() { var connectivityLevel = Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile().GetNetworkConnectivityLevel(); return connectivityLevel == NetworkConnectivityLevel.InternetAccess; } 

基本上什么ventura8说。 我会评论他的解决方案,提到命名空间,但我缺乏足够的声誉。

来自MSDN(重点是我的):

如果任何网络接口标记为“up”,并且不是回送或通道接口,则认为网络连接可用。

如果与“连接”你的意思是互联网连接,那么你应该DllImport函数InternetCheckConnection或InternetQueryOption

相反,如果你需要的只是要知道计算机是否连接到任何有用的局域网,你可以做的最好的事情是自己迭代网络连接,并过滤(使用NetworkInterfaceType , IsReceiveOnlyOperationalStatus )你不感兴趣。

我想它会告诉我连接是否可用,但是它总是返回true(并且打印第一条消息),即使我确定没有连接。

你对“连接”的含义有不同的意见。 就操作系统而言,当连接到NIC的修补以太网电缆连接,或者无线网卡连接到无线接入点,或者任何连接处于活动状态时,都可以建立连接。

手册还解释了这一点:

NetworkInterface.GetIsNetworkAvailable

指示是否有任何网络连接可用。

如果要检测Internet连接,请查看InternetGetConnectedState() (或InternetCheckConnection() ,以从WinINet API检查特定主机的可访问性)方法。