2012-04-15 6 views
0

Ich versuche gerade von http zu https für einige Server-API-Aufrufe zu wechseln, und ich habe ein Problem damit, das ich mir nicht erklären kann.NSURLConnection sendAsynchronousRequest: Langer Lauf auf https

Gleich nach dem Wechsel von http zu HTTPS Ich habe erlebt, dass meine asynchrone Anfrage dauert die volle 60 Sekunden zu Ende, trotz der Tatsache, dass der Server die Anfrage bereits bearbeitet hat.

Es wird kein Fehler ausgegeben, keine Zeitüberschreitung oder ähnliches, es dauert nur 60 Sekunden, bis die Anfrage abgeschlossen ist. Und dann, nach 60 Sekunden, macht es genau das, was es tun soll.

Das ist, was ich tue:

NSString *theBody = @"param1=value1&param2=value2"; 
NSData *bodyData = [theBody dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
NSURL *url = [NSURL URLWithString:@"https://my.api.server.com/call"]; 
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:url] autorelease]; 

[request setValue:@"My User-Agent" forHTTPHeaderField:@"User-Agent"]; 
// Tested this one, too. Yes, I did set to utf8 encoding when trying this 
// [request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPMethod:@"POST"]; 
[request setHTTPBody:bodyData]; 
// testing only 
// [request setTimeoutInterval:15]; 

[NSURLConnection sendAsynchronousRequest:request 
            queue:[NSOperationQueue mainQueue] 
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
          NSLog(@"Finished!"); 
         }]; 

Die Log-Meldung nach 60 Sekunden ausgelöst. Beim Aktualisieren der entsprechenden Daten, bevor die Protokollnachricht ausgegeben wird, kann ich sehen, dass alles bereits passiert ist - ich kann die aktualisierten Daten korrekt abrufen.

Ich dachte schon, es war mein Server dauert so lange für die Beantwortung, aber ich habe die gleiche Anfrage mit Ruby als einen kurzen Testlauf versucht und es hat richtig funktioniert.

Weiß jemand, was hier passieren könnte?

Vielen Dank im Voraus

Arne

+0

Was passiert, wenn Sie auf einen anderen Server schreiben? nur zum Testen? Post zu google auf https oder so ... Ich würde vermuten, dass Ihr Server eine Fehlfunktion hat –

+0

Sie können Recht haben. Aber es gibt eine lustige Tatsache: Wenn die Anfrage nicht erfolgreich ist, funktioniert es. Naja, zumindest dauert es nicht die 60 Sekunden, sondern kehrt sofort zurück. Ich gebe eine JSON-Antwort auf meinem Server zurück. Wenn der Aufruf erfolgreich ist, gibt er den Code 201 (Entität erstellt in Ordnung) und JSON für das Objekt zurück. Wenn es nicht erfolgreich ist, gibt es Code 4xx und JSON mit den Fehlermeldungen zurück. Fehler funktioniert sofort, Erfolg dauert NSURLConnection um 60 Sekunden zu beenden - aber es wird nach dieser Dauer korrekt beendet. – arnekolja

+0

Ich habe gerade versucht, Delegierung statt den Block zu verwenden und ich habe diese jetzt funktioniert. Aber wie zum Teufel ist das möglich? Ist es ein Fehler in iOS 5.1, dass 201 nicht als Antwortcode erkannt wird? Kann es nicht erklären ... irgendwelche Ideen? – arnekolja

Antwort

0

Es scheint tatsächlich ein Server-Problem zu sein. Ich habe es durch Setzen

keepalive_timeout 0 

in meiner Nginx Config-Datei behoben.

Verwandte Themen