我有一个 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.
到目前为止,常见的似乎是EIdHTTPProtocolException
、EIdClosedSocket
和EIdNotConnected
,但我也见过其他一些。设置一个异常处理程序来捕获这些并重试下载有时会起作用,有时它只是引发更多异常,再次看似随机,背后没有确定性原则。
使用静态下载用例永远不会发生这种情况的事实告诉我,在第二个用例中可能有一些奇怪的事情发生在我的代码没有正确解释的情况下。
代码真的很简单。在客户端:
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。