【发布时间】: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中,即使我使服务器无法访问,超时也只会在指定的超时间隔内发生。
标签: ios objective-c nsurlsession nsurlsessiondatatask nsurlsessionconfiguration