2

我有一个 Indy 服务器,当 URL 请求一个文件时让它发送一个文件是微不足道的,而且似乎总是能正常工作。

但我也在尝试设置第二种情况,如下所示:

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

(这适用于动态生成的内容,因此请求静态文件不起作用。)我正在使用自定义 Indy 客户端并调用TIdHTTP.Get以检索所有这些文件,在第二个用例中,它似乎遵循此算法:

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.

到目前为止,常见的似乎是EIdHTTPProtocolExceptionEIdClosedSocketEIdNotConnected,但我也见过其他一些。设置一个异常处理程序来捕获这些并重试下载有时会起作用,有时它只是引发更多异常,再次看似随机,背后没有确定性原则。

使用静态下载用例永远不会发生这种情况的事实告诉我,在第二个用例中可能有一些奇怪的事情发生在我的代码没有正确解释的情况下。

代码真的很简单。在客户端:

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;

在服务器端,请求运行一个生成文件的脚本(正确;我已经验证了该部分)并告诉 Indy 服务器将其作为 HTTP 响应返回。我尝试简单地打开 aTFileStream并将其分配给Response.ContentStream,并且尝试在对象上调用该ServeFile方法,Response但最终我仍然在客户端遇到相同的错误。服务器代码的相关部分如下所示:

  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 组件,有时它们同时使用它。保证每个线程都有自己的 IdHTTP 解决了这个问题。

于 2012-07-01T00:32:13.770 回答