如何配置 NSURLSession 请求在连接断开时的重试尝试?

Posted

技术标签:

【中文标题】如何配置 NSURLSession 请求在连接断开时的重试尝试?【英文标题】:How to configure NSURLSession request's retry attempts on connection drop? 【发布时间】:2016-08-07 14:46:13 【问题描述】:

我正在使用 NSURLSession 进行网络连接。在 Charlesproxy 中使用连接断开的测试表明实际上发送了三个请求而不是一个。

看起来它是一种 NSURLSession 低级工作 - 如果它确定连接断开,它实际上会在确定确实没有网络并调用委托/块失败之前再发送几个请求。

为了证明我的假设,我将 NSURLSessionConfiguration 从 defaultSessionConfiguration 更改为 backgroundSessionConfigurationWithIdentifier,它在调用委托/块之前开始发送更多请求 (4)。

在我看来这不是什么问题,只是想知道它是否可以通过某种方式进行配置。

【问题讨论】:

您确定它正在重新发送相同的请求,而不是,例如,响应身份验证挑战和/或跟踪重定向? AFAIK,如果连接未建立,只有后台 NSURLSession 上的会话任务会自动重试。 它不是在未建立连接时发生,而是在断开连接时发生,我的意思是不响应 3xx/4xx/5xx 而是显式断开连接。我正在创建的配置是默认配置,而不是背景配置。 你是如何明确放弃请求的? 使用 Charlesproxy 应用程序 -> 工具 -> 黑名单 -> 将端点添加到 drop 这和问题有什么关系??? 【参考方案1】:

我认为您所看到的是 NSURLSession 工作方式的产物。它:

同时与主机建立 IPv4 和 IPv6 连接。 使用第一个成功打开的连接,立即关闭另一个连接。 失败时,告诉 Reachability 查看它是否可以访问任何其他服务器(例如 apple.com)以确定要发回的错误代码。

AFAIK,这些都不是可配置的,AFAIK。

【讨论】:

我只在一种情况下看到多个请求 - 如果连接被断开(显式)。在所有其他情况下,总是有一个请求。此外,所有三个请求都是完全相同的,并且都转到 ipv4 地址。所以我认为情况并非如此。 这很奇怪。你确定你没有一堆排队的请求在会话中等待,由最大并发请求数限制吗?

以上是关于如何配置 NSURLSession 请求在连接断开时的重试尝试?的主要内容,如果未能解决你的问题,请参考以下文章

iOS NSURLSession 实现网络请求-文件下载-上传-后台下载

iOS NSURLSession 实现网络请求-文件下载-上传-后台下载

如何解决SSH连接Linux超时自动断开

如何解决SSH连接Linux超时自动断开

SecureCRT 超时自动断开的解决方法

如何在 python 中连接/断开/配置无线网络?