Delphi:设置TIdHttpServer的连接超时

时间:2016-01-30 12:47:01

标签: delphi indy idhttp

使用TIdHTTPServer(Indy 10.6),我想为关闭慢速或非活动客户端(客户端是常见浏览器)设置连接超时,并在60秒不活动后关闭所有僵尸连接。我在TIdContext.Connection中找到了Socket.ReadTimeout。这是正确的方法吗? TIdHTTPServer已经执行了这个(看起来有无限超时)?

WebServer := TIdHTTPServer.Create(nil);
WebServer.SessionState := false;
WebServer.KeepAlive    := false;
WebServer.OnCommandGet := CustomOnCommandGet;

procedure CustomOnCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo;
begin
    AContext.Connection.Socket.ReadTimeout := 60000;
    AResponseInfo.ContentStream := TFileStream.Create('C:/file.zip', fmOpenRead or fmShareCompat);
end;

1 个答案:

答案 0 :(得分:5)

您走在正确的轨道上,ReadTimeout属性可用于断开未及时发送请求的慢/死客户端。但是,您将ReadTimeout设置在错误的位置。

当触发OnCommand...事件时,TIdHTTPServer已经完整地读取了客户端的请求,因此在下一个请求之前,您的新设置才会生效相同的连接,如果有的话。因此,您应该在ReadTimeout事件中设置OnConnect值:

WebServer.OnConnect := CustomOnConnect;

procedure CustomOnConnect(AContext: TIdContext);
begin
  AContext.Connection.Socket.ReadTimeout := 60000;
end;

请记住,HTTP是无状态的。只有在使用 HTTP keep-alives时,才能在同一连接上发送多个HTTP请求,这是可选的。如果没有保持活动,服务器会在发送响应后关闭连接。客户端必须重新连接才能发送新请求。

您正在将服务器的KeepAlive属性设置为false,因此不会保留任何保持活动,每个请求都会断开连接。因此,您需要在ReadTimeout事件中设置OnConnect,以将其应用于在每个连接上发送的唯一请求。但是,如果您启用KeepAlive,并且客户端请求保持活动状态,则ReadTimeout将应用于客户端在同一连接上发送的每个请求,尤其是第一个请求。