如何在NSURLSession中为每个套接字禁用多个请求?

时间:2017-09-03 11:12:14

标签: ios http networking nsurlsession amazon-elb

我正在批量上传并使用NSURLSession在后台执行此操作。 直到iOS9一切顺利,但iOS10有不同的行为:

如果我排队100个POST请求,它会将它们全部批处理到同一个套接字

因此,所有100个请求在同一个套接字上并行发生,并在几分钟后发生超时。

在服务器端,我们正在使用AWS ELB,我猜我可以从请求标头/ ELB设置中禁用此行为。服务器本身是node.js.建议?

修改

Http header Connection: keep-alive可能就是这样。 但我无法改变它,我发现它使用Charles代理从close覆盖回keep-alive

2 个答案:

答案 0 :(得分:0)

理论上?之一:

  • 使用多个会话。 NSURLSession不会跨会话边界共享连接。
  • 使用外部队列(例如NSOperationQueue)来限制您添加到单个会话的并发请求数。

对于后台上传,可能唯一的选择是第一个。请注意,您应该将每个请求发送到单独的会话,因为您最终会因TLS协商等而产生大量不必要的开销。只需将每个会话的请求数量保持在理智状态。< / p>

但是,我怀疑这些方法中的任何一种都会对你有所帮助。无论是一个插座还是十个插座,您遇到的问题都是蜂窝网络无法长时间保持连接打开,或者亚马逊的服务器/路由器不愿意这样做。

因此,真正的修复几乎肯定涉及正确的重试逻辑。

但是当你说“在同一个插槽上并行”时,我有点困惑。除非启用HTTP流水线操作,否则这是不可能的,即使在iOS 10中也不是默认的AFAIK。确保您没有错误地打开它。

答案 1 :(得分:0)

最后,我们使用http标头Connection解决了这个问题。

iOS使用其Keep-Alive选项,这意味着您可以在同一个套接字上发送多个请求。关闭流水线操作和设置标头值都不能删除它。 iOS迫使它。 因此我们最终将其从服务器的响应中删除。它导致iOS每个请求打开一个新套接字。

这样我们就可以回到与NSURLSession号匹配的多个连接。允许我们在iOS 10&amp ;;上传下一堆大文件。 11&#39;测试版。