これは私がまだ解決できていない興味深い問題です。
インターネットを介してサーバーと通信するクライアントを作成しています。RAD Studio 2007 ネイティブ パーソナリティを使用して、Indy 10 で TIdTcpClient Internet Direct (Indy) コンポーネントを使用しています。
サーバーからデータを取得するために、SSL を使用してポート 443 経由で HTTP 要求を発行します。要求の詳細は HTTP メッセージ本文に含まれています。ここまでは順調ですね。このコードは、1 つの例外を除いて、まるで魔法のように機能します。
サーバーから約 336 KB の応答を生成する必要がある 1 つの要求を送信しています (HTTP 応答ヘッダーには Content-Length: 344795 が含まれています)。問題は、320KB しか返ってこないことです。XML 形式の応答は、XML 要素の途中で明らかに切り捨てられています。
価値のあることとして、XML は単純なテキストです。切り捨ての原因となる特殊文字はありません。私の TIdTcpClient コンポーネントは、部分的な応答を受信した後、サーバーが接続を正常に閉じたことを報告するだけです (これは、切り捨てられていないものであっても、すべての応答が完了すると予想されるため、問題ではありません)。
応答も数キロバイトを超える同じサーバーに対してほぼ同じ呼び出しを行うことができ、これらはすべて正常に機能します。私が行う 1 つの要求では約 850 KB が返され、別の要求では約 300 KB が返されます。
つまり、特定の 1 つの要求でのみこの問題が発生します。多数ある他のすべての要求は、完全な応答を受け取ります。
私はサービスの作成者と話し、私の要求の例を提供しました。彼はその要求が正しいと報告した. 彼はまた、彼のサーバーに同じリクエストを発行すると、完全な応答が得られるとも言いました。
私は途方に暮れています。サービスの作成者が間違っていて、実際にはその側の応答に問題があるか、または私の要求に何か特別なものがあります。
私が見逃している解決策はありますか?他の多くの読み取りメカニズム (ReadString、ReadStrings、ReadBytes など) も使用しましたが、すべて同じ結果 (320KB マークでのこの 1 つの特定の応答の切り捨て) を生成することに注意してください。
コードはおそらく関係ありませんが、とにかく含めます。申し訳ありませんが、専有情報が含まれているため、XML リクエストを含めることができません。(ReadTimeout は 20 秒に設定されていますが、リクエストは約 1 秒で返されるため、タイムアウトの問題ではありません。)
function TClient.GetResponse(PayloadCDS: TClientDataSet): 文字列; 変数 s: 文字列; 始める 試す 試す s := GetBody(ペイロードCDS); IdTcpClient1.Host := ホスト; IdTcpClient1.Port := StrToInt(ポート); IdTcpClient1.ReadTimeout := ReadTimeout; IdTcpClient1.Connect; IdTcpClient1.IOHandler.LargeStream := True; //IdTcpClient1.IOHandler.RecvBufferSize := 2000000; IdTcpClient1.IOHandler.Write(s); 結果:= IdTcpClient1.IOHandler.AllData; を除外する E: EIdConnClosedGracefully do 始める //例外を食べる 終わり; on e: 例外 do 始める 高める; 終わり; 終わり; 最後に IdTcpClient1.Connected の場合 IdTcpClient1.Disconnect; 終わり; 終わり;