NSURLSessionUploadTask(1)上传数据,(2)挂起〜200s,(3)重复

时间:2015-11-02 16:28:03

标签: ios nsurlsessionuploadtask

到目前为止,这是我NSURLSessionUploadTask

的地方
  • iOS应用程序使用POST
  • 启动NSURLSessionUploadTask
  • 服务器接收HTTP POST请求
  • 服务器读取请求的内容以便上传数据
  • iOS应用程序调用{​​{1}}以URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:等于totalBytesSent
  • 的最后一次通话结束
  • 服务器向iOS发送HTTP响应,包括以下内容:
HTTP/1.1 200 OK
Server: BaseHTTP/0.3 Python/2.7.10
Date: Fri, 30 Oct 2015 16:15:21 GMT
Content-Type: text/html

<html><head><title>POST RESPONSE</title></head><body><p>The file was uploaded.</p></body></html>
  • iOS应用程序收到此回复(通过Wireshark确认) Wireshark
  • iOS应用程序调用以下方法来完成上传任务,就像它应该:
    • totalBytesExpectedToSend
    • NSURLSessionTaskDelegate: -> URLSession:dataTask:didReceiveData:
  • 在挂起约200秒之后,iOS应用程序重复数据上载任务

此数据上传,HTTP 200响应,~200秒挂起过程似乎无限重复。为什么在iOS应用程序收到HTTP响应后不会调用NSURLSessionTaskDelegate -> URLSession:task:didCompleteWithError:NSURLSessionTaskDelegate: -> URLSession:dataTask:didReceiveData:

1 个答案:

答案 0 :(得分:0)

通过HTTP请求将数据正确上传到服务器后,iOS应用程序收到了HTTP响应,但因为没有传输Content-Length 在HTTP响应中,iOS应用程序无法知道HTTP响应何时结束。两种可能的解决方案:

  • 服务器在传输HTTP响应后关闭套接字
  • Content-Length包含在HTTP响应中
HTTP/1.1 200 OK
Server: BaseHTTP/0.3 Python/2.7.10
Date: Fri, 30 Oct 2015 16:15:21 GMT
Content-Type: text/html
Content-Length: 96

<html><head><title>POST RESPONSE</title></head><body><p>The file was uploaded.</p></body></html>

我成功地尝试了两种解决方案,但Content-Length解决方案更优越,因为它允许iOS应用程序和 服务器(假设服务器支持keep-alive)维护套接字连接以用于将来的HTTP请求。

我还在github here上放了一个非常基本的NSURLSessionUploadTask示例应用程序和webserver。