2017-09-03 78 views
0

我正在做批量上传并使用NSURLSession在后台执行它。 直到iOS9一切顺利,但iOS10有着不同的行为:如何在NSURLSession中禁用每个套接字的多个请求?

如果我排队100个POST请求,它将批次他们都同一个插座

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

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

编辑:

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

回答

0

最终我们使用http标头Connection解决了此问题。

iOS使用其Keep-Alive选项,这意味着您可以在同一套接字上发送多个请求。既不关闭流水线,也不设置标题值可以删除它。 iOS强制它。 所以我们最终将其从服务器的响应中删除。它导致iOS为每个请求打开一个新套接字。

这样我们回到了匹配数字NSURLSession的连接数。允许我们在iOS 10 & 11的测试版中上传一堆大文件。

0

理论上?或者:

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

对于后台上传,可能唯一的选择是第一个。请注意,您应该将而不是发送给单独的会话,因为您最终会从TLS协商中获得大量不必要的开销,等等。只需将每个会话的请求数量保持为理智。

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

所以真正的修复几乎肯定涉及适当的重试逻辑。

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

+0

谢谢!看来,即使我确定流水线关闭,它也会发生。此外,它看起来像iOS内部错误,因为它不会发生在iOS9上。最终我们发现,如果不允许http保持活动状态,我们可以解决这个问题。我会添加一个完整的答案 – avishic

相关问题