0

这是我到目前为止的地方NSURLSessionUploadTask

  • iOS 应用程序NSURLSessionUploadTask使用 POST启动
  • 服务器收到 HTTP POST 请求
  • 服务器读取请求的内容,以便上传数据
  • iOS 应用程序调用 URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:重复以totalBytesSent等于等于的最终调用结束totalBytesExpectedToSend
  • 服务器向 iOS 发送 HTTP 响应,其中包含以下内容:
HTTP/1.1 200 正常
服务器:BaseHTTP/0.3 Python/2.7.10
日期:格林威治标准时间 2015 年 10 月 30 日星期五 16:15:21
内容类型:文本/html

<html><head><title>POST RESPONSE</title></head><body><p>文件已上传。</p></body></html>
  • iOS 应用程序收到此响应(通过 Wireshark 确认) 线鲨
  • iOS应用程序不会像它应该调用以下方法来完成上传任务:
    • NSURLSessionTaskDelegate: -> URLSession:dataTask:didReceiveData:
    • NSURLSessionTaskDelegate -> URLSession:task:didCompleteWithError:
  • 相反,在挂起约 200 秒后,iOS 应用程序会重复数据上传任务

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

4

1 回答 1

0

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

  • 服务器在发送 HTTP 响应后关闭套接字
  • Content-Length包含在 HTTP 响应中
HTTP/1.1 200 正常
服务器:BaseHTTP/0.3 Python/2.7.10
日期:格林威治标准时间 2015 年 10 月 30 日星期五 16:15:21
内容类型:文本/html
内容长度:96

<html><head><title>POST RESPONSE</title></head><body><p>文件已上传。</p></body></html>

我成功地尝试了这两种解决方案,但该Content-Length解决方案更胜一筹,因为它通过允许 iOS 应用程序和服务器(假设服务器支持keep-alive)为未来的 HTTP 请求维护套接字连接来减少网络开销。

我还在 github 上放了一个非常基本的 NSURLSessionUploadTask 示例应用程序和网络服务器

于 2015-11-02T16:29:35.260 回答