使用 HttpClient 检查互联网连接

2024-01-01

我很难理解以下代码如何处理偶尔的互联网连接丢失。理想情况下,我想在连接丢失后暂停应用程序,并在连接再次启动时恢复。有关于如何操作的指南吗?

HttpClientHandler clientHandler = new HttpClientHandler();
clientHandler.UseDefaultCredentials = true;
HttpClient client = new HttpClient(clientHandler) { MaxResponseContentBufferSize = 1000000 };

HttpResponseMessage response = await client.GetAsync(Url, ct);

下面的示例不是直接的解决方案,但它是我构建的一个示例,用于展示如何在离线状态下将“预装”内容返回到请求,然后在连接恢复时返回在线状态。如果您能明白我在这里所做的事情,那么构建您想要的东西应该相当容易。

        [Fact]
        public async Task Getting_a_response_when_offline()
        {
            var offlineHandler = new OfflineHandler(new HttpClientHandler(), new Uri("http://oak:1001/status"));
            offlineHandler.AddOfflineResponse(new Uri("http://oak:1001/ServerNotRunning"), 
                new HttpResponseMessage(HttpStatusCode.NonAuthoritativeInformation)
                {
                    Content = new StringContent("Here's an old copy of the information while we are offline.")
                });

            var httpClient = new HttpClient(offlineHandler);

            var retry = true;

            while (retry)
            {
                var response = await httpClient.GetAsync(new Uri("http://oak:1001/ServerNotRunning"));

                if (response.StatusCode == HttpStatusCode.OK) retry = false;
                Thread.Sleep(10000);
            }
        }


        public class OfflineHandler : DelegatingHandler
        {
            private readonly Uri _statusMonitorUri;
            private readonly Dictionary<Uri, HttpResponseMessage> _offlineResponses = new Dictionary<Uri, HttpResponseMessage>();
            private bool _isOffline = false;
            private Timer _timer;

            public OfflineHandler(HttpMessageHandler innerHandler, Uri statusMonitorUri)
            {
                _statusMonitorUri = statusMonitorUri;
                InnerHandler = innerHandler;
            }

            public void AddOfflineResponse(Uri uri, HttpResponseMessage response)
            {
                _offlineResponses.Add(uri,response);
            }

            protected  async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
            {
                if (_isOffline == true) return OfflineResponse(request);

                try
                {
                    var response = await base.SendAsync(request, cancellationToken);
                    if (response.StatusCode == HttpStatusCode.ServiceUnavailable || response.StatusCode == HttpStatusCode.BadGateway)
                    {
                        MonitorOfflineState();
                        return OfflineResponse(request);
                    }
                    return response;
                }
                catch (WebException ex)
                {
                    MonitorOfflineState();
                    return OfflineResponse(request);
                }

            }

            private void MonitorOfflineState()
            {
                _isOffline = true;
                _timer = new Timer( async state =>
                {
                    var request = new HttpRequestMessage() {RequestUri = _statusMonitorUri};
                    try
                    {
                        var response = await base.SendAsync(request, new CancellationToken());
                        if (response.StatusCode == HttpStatusCode.OK)
                        {
                            _isOffline = false;
                            _timer.Dispose();
                        } 
                    }
                    catch
                    {

                    }
                }, null, new TimeSpan(0,0,0),new TimeSpan(0,1,0));

            }

            private HttpResponseMessage OfflineResponse(HttpRequestMessage request)
            {
                if (_offlineResponses.ContainsKey(request.RequestUri))
                {
                    return _offlineResponses[request.RequestUri];
                }
                return new HttpResponseMessage(HttpStatusCode.ServiceUnavailable);
            }
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 HttpClient 检查互联网连接 的相关文章

随机推荐

  • 根据 WooCommerce 产品类别禁用特定购物车商品数量字段

    在我使用的 woocommerce 中从 WooCommerce 产品类别的购物车中隐藏 删除商品 https stackoverflow com questions 54033207 hide remove item from cart
  • 如何运行Hadoop程序?

    我已经在笔记本电脑上安装了 Hadoop 并成功运行了安装指南中给出的示例程序 但是 我无法运行程序 rohit renaissance1 hadoop ch2 hadoop MaxTemperature input ncdc sample
  • PermissionError:pip 从 8.1.1 升级到 8.1.2

    我正在尝试将 pip 从 8 1 1 升级到 8 1 2 但它显示以下 PermissionError WinError 5 Access is denied 如何升级pip C gt python m pip install upgrad
  • 如何处理 multiprocessing.Pool 中的初始化错误?

    当初始化程序抛出如下错误时 脚本将不会停止 我想在开始主进程之前中止 不要运行 do something from multiprocessing import Pool import contextlib def initializer
  • 如何在 ARM Cortex-a8 中使用乘法和累加内在函数?

    如何使用GCC提供的乘累加内在函数 float32x4 t vmlaq f32 float32x4 t float32x4 t float32x4 t 谁能解释一下我必须传递给这个函数的三个参数 我的意思是源寄存器和目标寄存器以及函数返回什
  • Suds 忽略代理设置

    我正在尝试使用 salesforce python toolkit 对 Salesforce API 进行 Web 服务调用 但是我在让客户端通过代理时遇到问题 由于该工具包基于 suds 之上 因此我尝试只使用 suds 本身 看看是否可
  • 如何防止文本字段中向上/向下箭头的默认行为?

    我正在为关键字创建一个输入字段 当用户写作时 我会在插入符号位置下方的列表中显示关键字的建议 输入字段是单行 因此我使用向上 向下箭头键选择建议 然后按 Enter 插入它 它大部分都在工作 除了一个很大的例外是向上 向下键还将插入符号位置
  • 我可以在没有 WebView 的情况下运行 Javascript,或者 WebView 可以在没有 Activity 上下文的情况下运行(例如在服务中)吗?

    我有一个 HTML5 JavaScript 支持的应用程序 我想将其移植到 Android 在某些情况下 JavaScript 代码需要在后台 Service 中运行 没有 UI 因此没有 WebView 例如 为了同步 通过研究 WebV
  • 使用gradle导入GSON

    我正在尝试使用 android studio 中的 gradle 将 GSON 导入到我的项目中 我已经使用了上找到的说明谷歌的 GitHub https github com google gson和几个堆栈溢出页面 例如here htt
  • Google Chrome - 扩展程序与应用程序

    我想修改 chrome 起始页 更改背景 也许还有徽标 我想将 jQuery 包含在用户本地存储中并在用户页面加载 搜索页面 时加载它 我从来没有用 chrome 做过任何事情 所以我想要一些方法来开始 我需要使用应用程序或扩展程序来阅读吗
  • h5py:如何读取 hdf5 文件的选定行?

    是否可以从 hdf5 文件中读取给定的行集而不加载整个文件 我有相当大的 hdf5 文件 其中包含大量数据集 下面是我想要减少时间和内存使用的示例 usr bin env python import numpy as np import h
  • numpy 中的 FFT 与 MATLAB 中的 FFT 没有相同的结果

    我有一个带有复数的向量 可以找到here https www dropbox com s ve0de4ebk41s8y2 data txt dl 1 无论是在 Python 中还是在 MATLAB 中 我正在计算ifft 转化为 ifft
  • 抽象/虚拟方法的通用返回类型

    我有两个基类之间的关系 public abstract class RecruiterBase
  • 是否可以在 Core Data 中将 NSManagedObjects 返回为只读?

    我正在使用 Core Data 来缓存我正在编写的模块中的服务器数据 并且希望能够强制应用程序的其他部分不修改该数据 是否可以将我的 NSManagedObject 实例或用于获取它们的 NSManagedObjectContext 标记为
  • Rails 测试数据库在运行几次后未清除

    我正在使用 rspec 进行测试 我注意到运行测试后 它有时会在测试数据库中留下一些记录 我不知道为什么 我在配置文件中将 use transactional fixtures 设置为 true 但除非我手动删除记录 否则它们不会消失 有人
  • numpy 中的精度:比较数字时的问题

    首先介绍一下背景 我正在查找实数对称矩阵的特征值和特征向量 其中行总和为 0 更具体地说 一旦找到特征向量 我就会使用 argsort 来查找对特征值之一进行排序的排列 并将排列应用于原始矩阵 现在 我使用 numpy 包在 python
  • 为什么 @JsonProperty 不适用于 Kotlin 中的驼峰式属性

    有一个非常简单的类 class Price JsonProperty YPRICE val yprice String null JsonProperty ZPRICE val zPrice String null 以及将以下代码序列化为字
  • 异步任务 android onPostExecute

    在我的 Android 应用程序中 我使用 AsyncTask 从互联网下载图像 我传递了 url 然后我的 AsyncTask 进行下载 但是我如何将位图返回到我的活动中 目前 我将回调函数传递给 asynctask 构造函数 并在 On
  • 替换成有一个where子句吗?

    我正在编写一个应用程序 并使用 MySQL 作为 DBMS 我们正在下载房产报价 但存在一些性能问题 旧的架构看起来像这样 属性已更新 如果受影响的行数不为 1 则更新不被视为成功 否则更新查询解决了我们的问题 如果更新不成功 并且受影响的
  • 使用 HttpClient 检查互联网连接

    我很难理解以下代码如何处理偶尔的互联网连接丢失 理想情况下 我想在连接丢失后暂停应用程序 并在连接再次启动时恢复 有关于如何操作的指南吗 HttpClientHandler clientHandler new HttpClientHandl