2012-04-15 66 views
0

我試圖從一些服務器API調用現在從http切換到https,我遇到了一個問題,我無法向自己解釋。NSURLConnection sendAsynchronousRequest:長時間運行在https

從http切換到https後,我正在經歷我的異步請求需要60秒完成,儘管服務器已經處理了請求。

沒有錯誤被拋出,沒有超時發生或類似的事情,似乎需要60秒才能注意到請求已完成。然後,在60秒後,它完成了它的目的。

這是我在做什麼:

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!"); 
         }]; 

日誌信息是60秒後拋出。在日誌消息發佈之前刷新相應的數據時,我可以看到所有事情都已經發生 - 我可以正確地刷新刷新的數據。

我已經認爲這是我的服務器花了這麼長時間來回答,但我已經嘗試使用Ruby作爲快速測試運行的相同請求,並且它正常工作。

有誰知道這裏會發生什麼?

在此先感謝

阿恩

+0

當您發佈到其他服務器時發生了什麼?只是爲了測試?在https上發佈到谷歌...或許我會猜你的服務器有故障 – 2012-04-15 18:22:13

+0

你可能是對的。但是有一個有趣的事實:當請求不成功時,它會起作用。那麼,至少它不需要60秒,但立即返回。 我在我的服務器上返回一個JSON響應。如果調用成功,則返回對象的代碼201(實體創建正確)和JSON。如果不成功,它將返回錯誤消息代碼4xx和JSON。錯誤立即生效,成功需要NSURLConnection花費60秒才能完成 - 但在此持續時間後它會正確完成。 – arnekolja 2012-04-15 18:36:04

+0

我剛剛嘗試使用代表團,而不是再次阻止,現在我得到了這個工作。但是這可能怎麼樣? 201不會被識別爲響應代碼是iOS 5.1中的一個錯誤嗎?無法解釋它...有什麼想法? – arnekolja 2012-04-15 19:25:49

回答

0

這似乎是一個服務器的問題其實。我通過設置來修復它

keepalive_timeout 0 

在我的nginx的配置文件中。