2012-04-15 6 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でグーグルに投稿するか...あなたのサーバーには誤動作があると思います。 –

+0

あなたは正しいかもしれません。しかし、面白い事実があります:要求が成功しなかったら、それは機能します。少なくとも60秒かかるとは限りませんが、すぐに戻ります。 サーバー上でJSON応答を返します。呼び出しが成功すると、オブジェクトのコード201(エンティティが作成されました)とJSONが戻されます。成功しない場合は、コード4xxおよびJSONとエラーメッセージが返されます。エラーはすぐに機能し、成功するとNSURLConnectionは60秒かかって終了しますが、この時間が経過すると正常終了します。 – arnekolja

+0

私はちょうどブロックの代わりに委譲を使ってみました、そして、私はこれを今働いています。しかし、一体どのようにこれは可能ですか? iOS 5.1のバグで、201がレスポンスコードとして認識されないのですか?それを説明することはできません...任意のアイデア? – arnekolja

答えて

0

実際のサーバーの問題のようです。

keepalive_timeout 0 

をnginxの設定ファイルに設定しました。

関連する問題