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 秒?
我用两种方式设置超时
-
使用
NSMutableURLRequest
的timeoutInterval
属性
使用defaultSessionConfiguration
属性、timeoutIntervalForRequest
和timeoutIntervalForResource
我已使用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 秒 [服务器无法访问]的主要内容,如果未能解决你的问题,请参考以下文章