2

私は Indy サーバーを持っており、URL がファイルを要求したときにファイルを送信するのは簡単で、常に正しく動作しているようです。

しかし、次のような 2 番目のケースも設定しようとしています。

http://example.com/getFile.html?filename=myImage.png

(これは動的に生成されたコンテンツで機能するため、静的ファイルを要求しても機能しません。) 私はカスタム Indy クライアントを使用してTIdHTTP.Getおり、これらすべてのファイルを取得するために呼び出しています。2 番目の使用例では、このアルゴリズムに従っているようです。 :

Roll 1D4.  If you rolled 2 or higher, download correctly.
Otherwise, roll 1D6 against this table of Indy exceptions and
raise one of them.
If a random exception is raised, it MUST NOT be caught inside
of Indy code.

これまでのところ、一般的なものはEIdHTTPProtocolExceptionEIdClosedSocket、およびEIdNotConnectedのようですが、他にもいくつか見てきました。これらをキャッチしてダウンロードを再試行するように例外ハンドラーを設定すると、場合によっては機能することもありますが、別の場合には、さらに多くの例外が発生します。

静的ダウンロードの使用例を使用するとこれが決して起こらないという事実は、私のコードが適切に説明していない 2 番目の使用例の内部でおそらく奇妙なことが起こっていることを示しています。

コードは実にシンプルです。クライアント側:

procedure TdmConnection.GetFile(const URL: string; stream: TStream);

  procedure Retry;
  begin
     sleep(100);
     stream.Size := 0; //clear any aborted partial download
     http.Get(URL, stream);
  end;

begin
   try
      http.Get(URL, stream);
   except
      on EIdClosedSocket do
        Retry;
      on EIdNotConnected do
        Retry;
      on EIdHTTPProtocolException do
        Retry;
   end;
end;

そしてサーバー側では、要求はファイルを生成するスクリプトを実行し (正確に; 私はその部分を確認しました)、それを HTTP 応答として返すように Indy サーバーに指示します。単純に a を開いてTFileStreamに割り当てようとしましたが、オブジェクトでメソッドをResponse.ContentStream呼び出してみましたが、クライアント側でも同じエラーが発生します。サーバー コードの関連部分は次のようになります。ServeFileResponse

  if lServeFile <> '' then begin //variable set by the script
     if lServeFile = '***' then
        response.ResponseNo := 404
     else begin
       response.ResponseNo := 200;
       response.ServeFile(AContext, lServeFile);
     end;
  end;

経験豊富な Indy ユーザーは、私が間違っていることを知っていますか? Delphi XE に付属の Indy 10 を使用。

4

1 に答える 1

1

気にしないで、問題はインディにはありませんでした. さらにデバッグすると、IdHTTP コンポーネントを使用している 2 つのスレッドがあり、同時にそれを使用している場合もあることがわかりました。各スレッドが独自の IdHTTP を持つことを保証することで、問題が解決しました。

于 2012-07-01T00:32:13.770 に答える