web-dev-qa-db-fra.com

_kCFStreamErrorCodeKey = -2102 uniquement avec le wifi de certains FAI

J'utilise le code ci-dessous pour envoyer un fichier au serveur: 

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

Le fichier est en cours de téléchargement avec 3G/4G. Le code fonctionne également lorsque le périphérique est connecté au Wi-Fi de certains FAI ADSL, mais dans certains autres, le code ne fonctionne pas et le message d'erreur ci-dessous apparaît:

Domaine d'erreur = Code NSURLErrorDomain = -1001 "La demande a expiré." UserInfo = {NSErrorFailingURLStringKey = http://example.net , _kCFStreamErrorCodeKey = -2102, NSErrorFailingURLKey = http: /example.net: 80/au, NSLocalizedDescription = La demande a expiré {Domaine d'erreur = Code kCFErrorDomainCFNetwork = -1001 "La demande a expiré." UserInfo = {_ kCFStreamErrorCodeKey = -2102, NSErrorFailingURLStringKey = http://example.net , NSErrorFailingURLKey = http://example.net , NSLocalizedDescription = La requête a expiré.

Quelqu'un at-il une idée de quel est le problème?

12

J'ai finalement résolu mon problème en ajoutant Content-Length à la demande.

Lorsque nous n'ajoutons pas l'en-tête Content-Length à la demande, NSURLConnection l'envoie en tant que demande chunked et il semble que de tels problèmes soient fréquents dans les demandes tronquées.

En fait, je n'ai pas trouvé la cause première du problème avec cette requête chunked (j'ai cherché de nombreux sujets sur le Web, lu de nombreux articles, parlé à plusieurs autres programmeurs, mais je n'ai trouvé aucune cause fondamentale, alors j'ai décidé d'utiliser l'autre solution) mais J'ai partagé cette solution pour une personne pouvant utiliser des requêtes non groupées dans son entreprise. Comme je sais que la plupart des utilisations de demandes groupées sont en streaming en temps réel et que nous ne connaissons pas le Content-Length, donc si vous pouvez ajouter Content-Length, je suggère de l'utiliser pour éviter des problèmes groupés comme celui-ci.

6
Husein Behboodi Rad

Si vous exécutez une version d'entreprise de l'application, vérifiez auprès de l'administrateur de votre serveur si votre certificat est à jour et compatible avec votre serveur pare-feu. Le mien n'est pas.

0
Aviva