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

2023-12-15

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

我尝试了 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 分钟,直到超时。当我将其设置为 500ms 或其他值时也是如此。

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


解决方案:

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

在 Forms 中,创建一个界面

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> 

在Android项目中

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");
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 WIFI 网络没有互联网连接时,.net 或 Xamarin 互联网可用性检查 的相关文章

随机推荐

  • 如何设置 ASP.NET 身份验证属性

    我的 web config 文件中有以下设置 如果用户未登录 它基本上会限制对页面的访问 如果我不想使用 asp 登录控件或实现会员资格提供程序 我如何 告诉 asp loginregister aspx 页面已授权该请求如果我想实现自己的
  • Android 片段中的手电筒 - SurfaceView

    我正在尝试为当地音乐会开发手电筒应用程序 这是一个更大的应用程序的一部分 因此它位于一个片段中 这是代码 首先 我声明了该类及其变量 public class ConcertFragment extends Fragment ToggleB
  • 在 VBA 中解析 XML

    我有一个 XMLResponseXML目的 我想循环遍历所有名为 XYZ 的节点 我该怎么做呢 以下是您可以使用的一些功能parsing your XML Private xml As MSXML DOMDocument Private S
  • 读入R中路径中包含UTF-8字符的文件

    假设我有大量 rds 文件 其中一些文件的路径中包含 UTF 8 字符 由于某种原因 R 无法处理一些特殊的重音 例如enc2utf8 它应该打印 但在我最后它转换为 C 这使得 R 无法识别该文件 有什么想法如何处理这种情况 帮助 R 进
  • 从c中的另一个文件链接静态函数

    我有两个源文件 A c 和 B c A c 有一个函数 call me static int call me void call me register register call me call me 正如你所看到的 call me函数被
  • 从 UWP 应用程序中提取图标

    在尝试实现 打开方式 功能时 我遇到了从 UWP 应用程序提取图标的问题 因此 在收到推荐的应用程序列表后 借助以下命令打开特定文件SHAssocEnumHandlers 我试图在以下命令的帮助下提取每个应用程序的图标IAssocHandl
  • Windows 上 Boost.Python 1.54(调试版本)对 Python27.lib 的令人困惑的依赖关系

    我一定犯了某种明显的错误 但经过几个小时的战斗 我无法取得进一步的进展 升级到 Boost 1 54 CMake 2 8 12 和 Python 2 7 5 所有三个均来自slightly早期的次要版本 我的 Python 绑定projec
  • 如何获取 Pandas 数据框中所有非 NaN 项的行、列索引

    如何迭代如下所示的数据帧并将非 NaN 值位置作为元组返回 IE df 0 1 2 0 NaN NaN 1 1 1 NaN NaN 2 NaN 2 NaN 我会得到 0 1 2 0 1 2 的输出 最好的方法是执行嵌套 for 循环吗 或者
  • C++中M个盒子中N个球的组合列表

    我想编写一个函数 生成一个元组数组 其中包含 C 中 M 个盒子中 N 个球的所有可能排列 顺序 编辑 在结果列表中 并不重要 只是第一个必须是 N 0 0 和最后一个 0 0 N 我在网上没有找到这样的C 实现 只有字符的排列或排列数量的
  • 如何在 matplotlib 中使用交互式事件编辑表格数据

    在图中创建了一个表格 现在我想在双击单元格后编辑表格 添加 删除或修改该单元格中的数据 就像Excel中的编辑功能一样 我的python版本是3 64 代码如下 import matplotlib pyplot as plt import
  • 如何使用列表理解生成不同 lambda 函数的列表?

    这个问题是从涉及 Tkinter 按钮回调函数的原始应用程序中提炼出来的 这是说明该行为的一行 lambdas lambda i for i in range 3 如果您随后尝试调用生成的 lambda 函数 lambdas 0 lambd
  • mechanize 标签 br.set_handle_gzip 的作用是什么?

    我正在尝试 python mechanize 模块来编写一些脚本 当我运行它时 出现以下错误 set handle gzip 实际上是什么 manoj ubuntu pyth python rock py rock py 15 UserWa
  • 如何使用 Watir-Webdriver 不等待

    所以我正在编写一个 watir webdriver 脚本 并且我的应用程序正在使用 javascript 来呈现我想要与之交互的模式窗口 当我单击显示模态窗口的元素时 watir webdriver 只是坐在那里 直到最终超时 我在控制台窗
  • 撤销git中已删除的文件?

    新手需要一些帮助来解决混乱 我试图将我的网站推送到 git 存储库 所以我使用了 git add 命令 然后 在提交之前 我意识到我已经添加了根文件夹中的所有内容 而不仅仅是我想要的目录 由于我不想进行该提交 因此我使用 git rm ch
  • 大熊猫的累计不同计数

    我有一个数据框 其中有一列名为group另一列称为country 我想创建一个新列 输出不同值的累积计数country列同时分组group column 原始数据框 group country A usa A germany A germa
  • 如何比较 char* 和 NSString?

    您好 我正在比较数据库中的 UserName char 和 UITextField 中的 UserName NSString 这个怎么做 以下是我的代码 if UserName isEqual char sqlite3 column tex
  • htaccess 阻止热链接图像中的域

    我阻止了文件中的一些站点 但它们不断访问我的服务器并要求提供会减慢我的服务器速度的图像 我如何为它们添加规则 以便它们会看到大红色标志 停止热链接 RewriteEngine on RewriteCond HTTP REFERER Rewr
  • Rails 3 自定义 mime 类型 - 默认视图格式

    我需要渲染一些没有布局的视图 要跳过控制器操作中的 render layout gt false 行和 if else 逻辑 我有自定义 mime 类型 例如 phtml 纯 html Mime Type register text pht
  • 在 Bicep 模板上设置 Azure 应用服务服务器堆栈

    我正在尝试使用 Azure CLI 中的 Bicep 模板在 Linux 上部署 NET Core 3 1 Azure 应用服务 应用程序服务和相应的应用程序服务计划已正确部署 但 Azure 门户上的应用程序服务堆栈设置为空 我必须手动设
  • 当 WIFI 网络没有互联网连接时,.net 或 Xamarin 互联网可用性检查

    我知道如何检查设备是否有可用的互联网连接是一个大讨论 我尝试了 Ping WebClient 和 HTTPClient 我还使用 Xamarin Essentials 和连接插件 所有这些事情都有效 只需向谷歌或您选择的服务器发出请求 您就