10

iOS プロジェクトで ASIHTTPRequest を使用して REST サーバー メソッド呼び出しを実行し始めましたが、これまでのところ非常に成功しています。奇妙な断続的な問題が1つだけあります。[ASIHTTPRequest startAsynchronous] を使用すると、非常にまれに次の応答が返されます。

HTTP/0.9 200 OK

これが発生すると、サーバー メソッドが呼び出されません。通常、すべてのメソッド呼び出しは、'HTTP/1.1' で始まる応答を返します。接続を保護するために、GeoTrust/RapidSSL 証明書で HTTPS を使用しています。興味深いことに、プロトコルとして「http」を指定して SSL ポート (443) に接続しようとすると、同じ「HTTP/0.9 200 OK」応答が返されることがわかりました。

さらに情報を追加するだけです-問題は主に、アプリが一定期間アイドル状態になった後に発生します。たとえば、リクエストが正常に完了し、アプリをしばらくアイドル状態のままにしておくと、次のリクエストで問題が発生し、アプリは正常に動作し続けます。

何が起こっているのか、誰かに光を当てることができますか?

どうもありがとう、ジョナサン

更新: 問題が発生したときに ASIHTTPRequest によって出力されたデバッグ情報を下に貼り付けました。

2012-07-12 09:35:49.376 mytestapp[3038:18f07] [CONNECTION] Closing connection #13 because it has expired
2012-07-12 09:35:49.377 mytestapp[3038:18f07] [CONNECTION] Closing connection #14 because it has expired
2012-07-12 09:35:49.378 mytestapp[3038:18f07] [CONNECTION] Closing connection #15 because it has expired
2012-07-12 09:35:49.380 mytestapp[3038:18f07] [CONNECTION] Request #39 will use connection #16
2012-07-12 09:35:49.381 mytestapp[3038:18f07] [CONNECTION] Request #40 will use connection #17
2012-07-12 09:35:49.382 mytestapp[3038:18f07] [CONNECTION] Request #41 will use connection #18
2012-07-12 09:35:49.529 mytestapp[3038:18f07] [STATUS] Request <ASIHTTPRequest: 0x88a1e00> finished downloading data (0 bytes)
2012-07-12 09:35:49.529 mytestapp[3038:18f07] [STATUS] Request <ASIHTTPRequest: 0x88a1e00> received response headers
2012-07-12 09:35:49.530 mytestapp[3038:18f07] [AUTH] Request <ASIHTTPRequest: 0x88a1e00> has passed Basic authentication
2012-07-12 09:35:49.530 mytestapp[3038:18f07] [CONNECTION] Got no keep-alive header, will keep this connection open for 60.000000 seconds
2012-07-12 09:35:49.530 mytestapp[3038:18f07] [CONNECTION] Request #41 finished using connection #18
2012-07-12 09:35:49.531 mytestapp[3038:18f07] [STATUS] Request finished: <ASIHTTPRequest: 0x88a1e00>
2012-07-12 09:35:49.531 mytestapp[3038:15803] responseHeaders={
}
2012-07-12 09:35:49.531 mytestapp[3038:18f07] [STATUS] Request cancelled: <ASIHTTPRequest: 0x88a1e00>
2012-07-12 09:35:49.532 mytestapp[3038:18f07] [STATUS] Request cancelled: <ASIHTTPRequest: 0x88a0200>
2012-07-12 09:35:49.532 mytestapp[3038:18f07] [STATUS] Request <ASIHTTPRequest: 0x88a0200>: Cancelled
2012-07-12 09:35:49.532 mytestapp[3038:18f07] [CONNECTION] Request #39 failed and will invalidate connection #16
2012-07-12 09:35:49.533 mytestapp[3038:18f07] [STATUS] Request cancelled: <ASIHTTPRequest: 0x88a0a00>
2012-07-12 09:35:49.533 mytestapp[3038:18f07] [STATUS] Request <ASIHTTPRequest: 0x88a0a00>: Cancelled
2012-07-12 09:35:49.533 mytestapp[3038:18f07] [CONNECTION] Request #40 failed and will invalidate connection #17
4

3 に答える 3

2

この場合の IOS の仕様については不明ですが、HTTP 0.9 は完全に放棄されています。これには明確な理由があります。「Host:」ヘッダーをサポートしていません。これは、単一の IP が仮想ホストを持つことはまったくできないことを意味します。そのようなものは90年代の終わりに時代遅れになりました.

そのような反応は、実生活では決して起こらないはずです。それでも発生する場合は、一部のクライアントが「GET / HTTP/0.9」などのリクエストを行った可能性があります。しかし、これらのクライアントは約 15 年前に姿を消しました。

SSL は、HTTP があまり認識していないものです。したがって、これは関係ないと思います。SSL トンネルがセットアップされ、その後プレーン HTTP が実行されます。

結論として、あなたまたは誰かが古いメソッドをトリガーした可能性があります。そして、IOSはそれをどうするか分からないかもしれません。おそらく、IOS メソッドはホスト名が含まれるメソッドが制限されているため、トリガーされません。とにかく、クライアントが本当に 0.9 を話しているかどうかについて心配する必要はありません。とにかく、ほとんどのサイトから適切な回答が得られないからです。クライアントが 1.1 を話し、あなたが 0.9 と答えた場合、リクエストが何らかの形で誤解され、可能な限り低い HTTP バージョンへのフォールバック メカニズムが発生する可能性があります。リクエストのホスト名を設定するのを忘れたか、構文エラーを作成した可能性がありますか?

于 2012-06-12T01:50:51.397 に答える
1

HTTP/0.9 200 OK存在しないメッセージ ヘッダーです。HTTP/0.9 は request: として定義され、GET <Request-URI> HTTP/0.9 <CRLF>これに対する応答は であり[Entity-Body]、ステータス行もヘッダーもありません。(<urn:ietf:rfc:1945>)

ソフトウェアのどこかにエラーがあります。リクエストが失敗したか、まだ受信されていないと思います。

于 2013-05-23T22:02:32.960 に答える
1

Web 上でこの問題についていくつかの言及があり、基本的には永続的な接続に関連しており、バグのあるサーバーによって返された Content-length ヘッダーとコンテンツ自体に何か問題がある場合です。ブラウザと iOS フレームワークを台無しにする可能性がありますが、実際にはヘッダーに気付かないのです。

考えられる説明の1 つを次に示します。

永続的な接続を無効にしてみてください。役立つはずです。このアドバイスは、ASIHTTPRequest の開発者からのものです (非常によく似た状況)。

[httpRequest setShouldAttemptPersistentConnection:NO]; 
于 2012-07-15T12:34:40.143 に答える