【问题标题】:Delphi: Setting connection timeout for TIdHttpServerDelphi:为 TIdHttpServer 设置连接超时
【发布时间】:2016-01-30 12:47:01
【问题描述】:

使用 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;

【问题讨论】:

    标签: delphi indy idhttp


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 好的,谢谢!但是为什么您删除了答案[...] as such your ReadTimeout value will only be able to avoid slow/dead clients that cannot send requests in a timely manner. 的一部分。您认为,就我而言,“读取超时”对于关闭死/慢连接没有用?
    • 我删除了该短语,因为在我进行编辑时,它不再适合其余答案的流程。不过它仍然适用,所以我把它放回去了。
    猜你喜欢
    • 2020-02-20
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2017-09-18
    • 2012-05-01
    • 2014-07-28
    相关资源
    最近更新 更多