我有一个需要从网站访问资源的.NET应用程序。访问这些资源可能需要用户更改其代理设置。
我想知道如何最好地从应用程序检测网络的存在(即潜在的互联网连接),这种方式对于决定是否为用户提供更改其代理设置的能力非常有用。如果没有可用的网络可以连接到互联网,那么更改代理设置将无济于事。
有NetworkInterface.GetIsNetworkAvailable(),但这会返回true
如果标记了任何网络接口" up"并不是一个环回或 隧道接口。
我发现断开网络电缆和我的机器上的wifi(无法访问Google)后,此方法仍然返回true,并且仍有许多网络接口。
显然,我所进行的测试只是探索性的,不能作为提出某种过滤器的决定性手段。有一个建议的过滤器here,但在我的测试中,无论我是否有互联网连接,这总是返回false,除非我连接到VPN。
我无法尝试访问(例如)google.com,因为代理设置配置不正确也会导致失败。
我想要做的是否有可行的解决方案?我可以做得比GetNetworkIsAvailable()更好吗?
答案 0 :(得分:0)
Simon Mourier在answer on another question中指出,在某些情况下,标准方法被虚拟卡欺骗了。
他提议使用For 1 month 14 days round up to 1.5 month
Nearest month or half month
Days
3 months
2 months
1 months
4 months
1 months
3 months
3 months
6 months
4.5 months
6 months
,并通过接口进行迭代以检查连接并忽略虚拟,隧道和环回接口。
我已经实施了他的解决方案,效果很好。在性能方面,您可以跳过他的首字母NetworkInterface.GetAllNetworkInterfaces()
,因为其余代码将进行完全相同的检查。两种方法都占用大量CPU,因此无需同时运行两种方法。
我不会抄袭并记功,因此请看一下他的回答:https://stackoverflow.com/a/8345173/146921