ios - _kCFStreamErrorCodeKey=-2102 仅适用于某些 ISP 的 wifi

标签 ios objective-c post nsurlconnection

我使用下面的代码将文件发送到服务器:

NSString *urlString = [NSString stringWithFormat:@"%@%@",[LIUtility sharedUtility].uploadConnectionURL,BR_SERVER_UPLOAD_ADDRESS_FILE];

self.request =[[NSMutableURLRequest alloc] init];
[self.request setURL:[NSURL URLWithString:urlString]];
[self.request setHTTPMethod:@"POST"];

PKMultipartInputStream *body = [[PKMultipartInputStream alloc] init];

NSString *requestString =[self getRequestStringForRange:range andExtension:fileName];
NSData *requestData = [requestString dataUsingEncoding:NSUTF8StringEncoding];

NSString *jsonLengthString = [NSString stringWithFormat:@"%04lu",(unsigned long)requestData.length];
NSData *jsonLengthData = [jsonLengthString dataUsingEncoding:NSUTF8StringEncoding];

[body addPartWithName:@"jsonLength" data:jsonLengthData];
[body addPartWithName:@"json" data:requestData];
[body addPartWithName:@"separator" string:@"\r\n"];
[body addPartWithName:@"fileData" filename:fileName stream:dataStream streamLength:streamSize];

[self.request setHTTPBodyStream:body];
[self.request setTimeoutInterval:60];
NSString *contentType = LI_CONNECTION_CONTENTTYPE;
[self.request addValue:contentType forHTTPHeaderField: @"Content-Type"];

self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self];
_responseData = [NSMutableData data];
[self.connection start];

文件正在使用 3G/4G 上传。当设备连接到某些 ADSL ISP 的 wifi 时代码也有效,但在其他一些 ISP 中代码不起作用,我收到以下错误:

Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={NSErrorFailingURLStringKey=http://example.net, _kCFStreamErrorCodeKey=-2102, NSErrorFailingURLKey=http:/example.net:80/au, NSLocalizedDescription=The request timed out., _kCFStreamErrorDomainKey=4, NSUnderlyingError=0x16a40410 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2102, NSErrorFailingURLStringKey=http://example.net, NSErrorFailingURLKey=http://example.net, NSLocalizedDescription=The request timed out., _kCFStreamErrorDomainKey=4}}}

有人知道问题出在哪里吗?

最佳答案

我终于通过在请求中添加 Content-Length 解决了我的问题。

当我们没有将 Content-Length header 添加到请求中时,NSURLConnection 将其作为 chunked 请求发送,这似乎是这样的问题对于分 block 请求很常见。

其实我没有找到这个chunked请求问题的根本原因(我在网络上搜索了很多主题,阅读了很多文章,与其他几个程序员交谈但没有找到任何根本原因,所以我决定使用其他解决方案)但我为可以在他们的业务中使用非分 block 请求的人分享了这个解决方案。据我所知,分 block 请求的大多数用法都是实时流式传输,我们不知道 Content-Length 所以如果你可以添加 Content-Length,我建议使用它以避免像这样的分 block 问题。

关于ios - _kCFStreamErrorCodeKey=-2102 仅适用于某些 ISP 的 wifi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33751432/

相关文章:

android - 代号一 - 从 FormulA 到 Form 再到 Form C 的过渡

java - 使用 Java 将数据发布到服务器,如 jQuery 的 $.post()

ios - 从 SQLite 表中检索 REAL 值

objective-c - iOS:为什么这个实例被释放?

ios - Bitcode_strip 在 Xcode 8 中失败

javascript - GitHub API v3 : Getting 404 error on creating issues

javascript - React,如何将表单数据发布到 API 端点?

iphone - 构建成功但未在模拟器上运行

iphone - 有没有办法将表格的单元格并排堆叠起来?

ios - 两个 UIDatePicker(时间模式)- 如何判断它们是否相隔至少 3 分钟?