2015-11-17 19 views
12

io uso il codice qui sotto per inviare un file al server:_kCFStreamErrorCodeKey = -2102 solo con wifi di alcuni ISP

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]; 

Il file viene caricato con il codice di 3G/4G.The funziona anche quando il dispositivo è collegato a wifi di alcuni ISP ADSL ma in alcuni altri ISP il codice non funzionano e ottengo sotto l'errore:

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}}}

qualcuno ha qualche idea su ciò che è il problema?

risposta

6

Ho finalmente risolto il problema aggiungendo Content-Length alla richiesta.

Quando non si aggiunge l'intestazione Content-Length alla richiesta, NSURLConnection si invia come richiesta chunked e sembra che tali problemi siano comuni con le richieste chunked.

In realtà non mi hanno trovato la causa principale dei problemi con questa richiesta chunked (ho cercato molti soggetti in web, legge molti articoli, ha parlato con diversi altri programmatori, ma non trovano alcun causa principale, così decido di utilizzare la altra soluzione) ma ho condiviso questa soluzione per qualcuno che può utilizzare la richiesta non-chunked nella loro attività. Poiché so che molti usi delle richieste bloccate sono in streaming in tempo reale, non conosciamo lo Content-Length, quindi se è possibile aggiungere Content-Length, suggerisco di usarlo per evitare problemi di tipo chunked come questo.

+1

Questo ha funzionato anche per me. Non sono sicuro se questo è rilevante, ma per riferimento: Xcode 7.2 utilizzando Swift, iPad con iOS 9.2.1. Un nuovo Apple AirPort ha avuto il problema; uno più vecchio no. –

0

Ho appena risolto il problema ...

Spero questo potrebbe aiutare, se non trovate la soluzione su Internet, perché questa è un'esperienza personale.

Ho configurato tutte le intestazioni HTTP, tutti i parametri e controllato tutta la programmazione su Objective-C, ma avevo dimenticato di controllare il lato server, la mia architettura comprendeva 3 componenti: l'app, il server REST e un file server, file il server aveva problemi di rete con il dominio, ecco perché l'app non funzionava, dopo aver risolto il problema ha funzionato perfettamente.

0

Se si sta utilizzando una versione Enterprise dell'applicazione, verificare con l'amministratore del server se il Cert è aggiornato e compatibile con il server firewall. Il mio non lo è.