NSURLSession : 设置请求超时 > 75 秒 [服务器无法访问]

Posted

技术标签:

【中文标题】NSURLSession : 设置请求超时 > 75 秒 [服务器无法访问]【英文标题】:NSURLSession : setting request time out > 75 Seconds [Server unreachable] 【发布时间】:2016-01-25 11:45:11 【问题描述】:

我有一个发布请求,需要使用NSURLSession 提交。由于某些要求,我必须将超时设置为 230 秒。所以这里的想法是,NSURLSession 应该等待 230 秒,直到它将任务声明为超时问题。

我做了一些实验——

    我设置了一些任意 10 秒来检查超时问题,工作正常。 我将 50 秒设置为超时,工作正常。 我设置了 60 秒(默认超时),它又可以正常工作了。 我将 75 秒设置为超时,它也可以正常工作。 但是,当我将 76 设置为超时时,请求会在 75 秒 内超时 我将 100 秒 设置为超时,但再次请求在 75 秒后超时。 我将 200 秒 设置为超时,请求再次在 75 秒 后超时。

那么是否有一些未记录的值,例如可用的最大超时时间为 75 秒?

我用两种方式设置超时

    使用NSMutableURLRequesttimeoutInterval 属性 使用defaultSessionConfiguration 属性、timeoutIntervalForRequesttimeoutIntervalForResource

我已使用dataTaskWithRequest 发布服务。

因此在确定超时时,最小值在所有三个属性之间生效。如果它小于 75 秒,它工作正常。但如果大于 75 秒,则忽略它。

请告诉我,有什么问题?是 75 秒是分配给超时的最高时间,或者我在这里遗漏了什么。

附注我正在主线程中执行任务并在 ios 9.2 中进行调试。为了清楚起见,我正在检查服务器无法访问时的超时

【问题讨论】:

你在测试什么样的超时?是 HTTP 级别的超时(TCP 连接已建立,但服务器在返回响应之前等待),还是 TCP 级别的超时(对 SYN 数据包没有响应,例如通过将请求发送到没有服务器使用的 IP,或者使用包过滤)? 另外,通过defaultSessionConfiguration 进行测试时,您确实使用新创建的配置创建了一个会话,对吧? 是的。我使用sessionWithConfiguration 使用会话配置。在我的情况下,我正在检查服务器无法访问时的超时。 如果服务器不可达,那么是 TCP 超时,而不是 HTTP 超时。直接操作套接字时,这将通过setsockopt 和参数TCP_CONNECTIONTIMEOUT 设置,但是我认为您无法通过NSURLSession 访问它。默认值来自sysctl 设置net.inet.tcp.keepinit(在 Mac OS X 上确实是 75,所以在 iOS 上大概是一样的,懒得检查)。不过,不确定是否有任何方法可以从应用程序中覆盖它。 谢谢。实际上,这很有意义。将尝试其他一些事情,例如在使其可访问的同时保持服务器繁忙,并查看超时是否仍会在 75 秒内发生。但是,从NSURLConnection 的角度来看,我想它只将 TCP 超时视为 HTTP 超时。这就是为什么在NSURLConnection 中,即使我使服务器无法访问,超时也只会在指定的超时间隔内发生。 【参考方案1】:

有可能75秒是服务端的超时时间。

【讨论】:

我不这么认为。使用 NSURLConnection 我得到超过 4 分钟的超时,即 240 秒。

以上是关于NSURLSession : 设置请求超时 > 75 秒 [服务器无法访问]的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession访问网络数据

NSURLSession 超时

下载许多文件时 AFNetworking / NSURLSession 超时

异步图像下载可以超时还是我需要 NSURLSession?

NSURLSession 上传任务超时

NSURLSession sharedSession 默认超时