我有一个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
,但我也见过其他一些。设置一个异常处理程序以捕获这些并重试下载有时会起作用,有时它只会引发更多异常,再次看似随机而没有确定性原则。
使用静态下载用例发生此永远不会的事实告诉我,在第二个用例中可能存在一些奇怪的问题,即我的代码没有正确计算。< / p>
代码非常简单。在客户端:
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响应返回。我尝试过简单地打开TFileStream
并将其分配给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库存。
答案 0 :(得分:1)
没关系,问题不在Indy。在进一步调试后,我最终发现有两个线程都使用IdHTTP组件,有时他们同时使用它。保证每个线程都有自己的IdHTTP解决问题。