当 WIFI 网络没有 Internet 连接时检查 .net 或 Xamarin Internet 可用性

Posted

技术标签:

【中文标题】当 WIFI 网络没有 Internet 连接时检查 .net 或 Xamarin Internet 可用性【英文标题】:.net or Xamarin Internet availability check when the WIFI network has no internet connection 【发布时间】:2019-06-09 09:33:36 【问题描述】:

我知道如何检查设备是否有可用的互联网连接是一个很大的讨论。

我尝试过 Ping、WebClient 和 HTTPClient。 我还使用 Xamarin Essentials 和连接插件。

所有这些都有效,只需向谷歌或您选择的服务器发出请求,您就会得到答案。 您还可以设置 2 秒的超时时间等等。

但现在我遇到了我连接到 WIFI 但 WIFI 本身没有活动的互联网连接的情况。

所以我写的所有东西都不再起作用了。问题是超时会以某种方式被忽略。也许.net中的错误?我不知道。

现在我发现了最后一件事:

try
        
            var request = (HttpWebRequest)WebRequest.Create("https://www.google.com");
            request.KeepAlive = false;
            request.Timeout = 2000;

            using (var response = (HttpWebResponse)await request.GetResponseAsync())
            
                if (response.StatusCode == HttpStatusCode.OK)
                
                    //Connection to internet available
                    return true;
                
                else
                
                    //Connection to internet not available
                    return false;
                
            
        
        catch (WebException webEx)
        
            if (webEx.Status == WebExceptionStatus.Timeout)
            
                return false;
            
        
        catch (Exception e)
        
            return false;
        

这是在达到 2 秒超时时我得到 WebException 的唯一解决方案。 在所有其他解决方案中,我坚持超过 1 分钟,直到达到超时。另外,当我将其设置为 500 毫秒或其他值时。

有人知道为什么没有达到给定超时的原因,例如使用其他方法吗?

【问题讨论】:

你得到答案了吗?有没有办法在不发送 ping 的情况下做到这一点 【参考方案1】:

解决方案:

您可以使用DependencyService来实现它。参考以下代码。

在表单中,创建一个界面

using System;
namespace app1

  public interface INetworkAvailable
  

    bool IsNetworkAvailable();
  

ios 项目中

using System;
using Xamarin.Forms;
using Foundation;

[assembly: Dependency(typeof(IsNetworkAvailableImplement))]
namespace xxx.iOS

  public class IsNetworkAvailableImplement:INetworkAvailable
  
    public IsNetworkAvailableImplement()
    
    

    bool INetworkAvailable.IsNetworkAvailable()
    
        NSString urlString = new NSString("http://captive.apple.com");

        NSUrl url = new NSUrl(urlString);

        NSUrlRequest request = new NSUrlRequest(url, NSUrlRequestCachePolicy.ReloadIgnoringCacheData, 3);

        NSData data = NSUrlConnection.SendSynchronousRequest(request, out NSUrlResponse response, out NSError error);

        NSString result = NSString.FromData(data,NSStringEncoding.UTF8);

        if(result.Contains(new NSString("Success")))
        
            return true;
        

        else
        
            return false;
        

    
  

不要忘记允许 HTTP 访问。在 info.plist 中添加以下代码

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict> 

在安卓项目中

using System;
using Java.Lang;
using Xamarin.Forms;

[assembly: Dependency(typeof(IsNetworkAvailableImplement))]
namespace xxx.Droid

  public class IsNetworkAvailableImplement:INetworkAvailable
  
    public IsNetworkAvailableImplement()
    
    

    public bool IsNetworkAvailable()
    
        Runtime runtime = Runtime.GetRuntime();

        Process process = runtime.Exec("ping -c 3 www.google.com");

        int result = process.WaitFor();

        if(result==0)
        
            return true;
        

        else
        
            return false;
        
    
  

现在你可以在表单中调用它,就像

bool isAvailable= DependencyService.Get<INetworkAvailable>().IsNetworkAvailable();

if(isAvailable)

  Console.WriteLine("network is available");


else

  Console.WriteLine("network is unavailable");
 

【讨论】:

嗨 Lucas Zhang,我们开发 Xamarin iOS 和 android 原生。但是您的 iOS 代码正在运行!在我没有互联网连接的情况下连接到 WIFI 的特殊情况下,它并没有忽略超时!伟大的!再次感谢!我稍后会检查Android代码。 还有一些信息。我对 captive.apple.com 使用“https://”而不是“http://”,所以我不需要在 info.plist 中添加 NSAppTransportSecurity。【参考方案2】:

已编辑: Xamarin Essentials 是最佳解决方案,因为它提供了更多选项,这是如何使用它的示例

在项目中设置 Xamarin Essential NuGet 后

您的代码我们如下所示

         if (Xamarin.Essentials.Connectivity.NetworkAccess == Xamarin.Essentials.NetworkAccess.Internet)
         
             //your Code if there is an internet
         
         else
         
             //your Code if there isn't an internet
         

看看这个: https://github.com/xamarin/Essentials

【讨论】:

你好@Muhammad,谢谢你的回答。这也无法正常工作。正如我所写的,当您在提供互联网连接的 wifi 中时,这是有效的。但是,当您在没有 Internet 连接的 WIFI 中时,您也会返回:Xamarin.Essentials.NetworkAccess.Internet 它在这种情况下不起作用。 Xamarin Essential 在这种情况下也不起作用。 docs.microsoft.com/en-us/xamarin/essentials 我明白了,假设当 wifi 可用但实际上没有互联网时,这意味着您有本地网络或此插件也支持的受限访问,我现在就试试 是的,没错。我们开发了一个应用程序来配置一些设备。这个设备提供了他自己的WIFI接入点。当您连接到此网络时,您将有一个 WIFI 连接,但网络肯定无法为您提供互联网连接。但在这种情况下,Xamarin Essentials 仍然返回您将拥有 Internet 连接,这是不正确的。我也试过这个:github.com/jamesmontemagno/ConnectivityPlugin 但它有同样的问题。

以上是关于当 WIFI 网络没有 Internet 连接时检查 .net 或 Xamarin Internet 可用性的主要内容,如果未能解决你的问题,请参考以下文章

Win10双无线网卡怎么切换无线网卡连接WiFi

surface连接不上wifi

win10无internet安全

笔记本电脑连WiFi后显示无Internet但是可以上网?

电脑连接Wifi,只能上QQ不能上网。关键字:无Internet访问权限。

电脑连接Wifi,只能上QQ不能上网。关键字:无Internet访问权限。