Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在NSURLSession中禁用每个套接字的多个请求?_Ios_Http_Networking_Nsurlsession_Amazon Elb - Fatal编程技术网

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

Ios 如何在NSURLSession中禁用每个套接字的多个请求?,ios,http,networking,nsurlsession,amazon-elb,Ios,Http,Networking,Nsurlsession,Amazon Elb,我正在做批量上传,并使用NSURLSession在后台完成。 在iOS9之前,一切都很顺利,但iOS10有一个不同的行为: 如果我将100个POST请求排队,它会将它们全部批处理到同一个套接字中 因此,所有100个请求在同一个套接字上并行发生,几分钟后超时 在服务器端,我们使用AWS ELB,我猜我可以从请求头/ELB设置中禁用此行为。服务器本身是node.js。建议 编辑: 可能是吧。 但我无法更改它,我看到它被覆盖,从close返回到keep-alive使用Charles代理。理论上?要么:

我正在做批量上传,并使用NSURLSession在后台完成。 在iOS9之前,一切都很顺利,但iOS10有一个不同的行为:

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

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

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

编辑:

可能是吧。 但我无法更改它,我看到它被覆盖,从
close
返回到
keep-alive
使用Charles代理。

理论上?要么:

  • 使用多个会话。NSURLSession不跨会话边界共享连接
  • 使用外部队列(例如NSOperationQueue)限制添加到单个会话的并发请求数
对于后台上传,可能唯一的选择是第一个。请注意,您不应该将每个请求发送到单独的会话,因为TLS协商等将导致大量不必要的开销。只需保持每个会话的请求数正常即可

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

因此,真正的解决方案几乎肯定涉及正确的重试逻辑


但是当你说“在同一个插座上并行”时,我有点困惑。除非启用HTTP管道,否则这是不可能的,即使在iOS 10中,默认情况下也不会启用HTTP管道。请确保您没有错误地打开它。

最终,我们使用http头解决了这个问题

iOS使用其
保持活动状态
选项,这意味着您可以在同一个套接字上发送多个请求。无论是关闭管道还是设置标头值都无法删除它。我强迫它因此我们最终将其从服务器的响应中删除。它导致iOS每个请求打开一个新套接字


通过这种方式,我们回到了一个与号码
nsursession
匹配的连接号码。允许我们在iOS 10和11的beta版后台上传大量大文件。

谢谢!看起来,即使我确保管道关闭,这种情况也会发生。而且,它看起来像是iOS内部的bug,因为它并没有发生在iOS9上。最终我们发现,当不允许http保持活动状态时,我们可以解决这个问题。我会补充一个完整的答案