Delphi:设置TIdHttpServer的连接超时
使用TIdHTTPServer(Indy 10.6),我希望为关闭慢速或非活动客户端(客户端是公共浏览器)设置连接超时,并在60秒不活动后关闭所有僵尸连接。我在TIdContext.Connection中找到了Socket.ReadTimeout。这条路对吗?TIdHTTPServer已执行此操作(似乎有无限超时)Delphi:设置TIdHttpServer的连接超时,delphi,indy,idhttp,Delphi,Indy,Idhttp,使用TIdHTTPServer(Indy 10.6),我希望为关闭慢速或非活动客户端(客户端是公共浏览器)设置连接超时,并在60秒不活动后关闭所有僵尸连接。我在TIdContext.Connection中找到了Socket.ReadTimeout。这条路对吗?TIdHTTPServer已执行此操作(似乎有无限超时) 您的做法是正确的,ReadTimeout属性可用于断开未及时发送请求的慢速/死机客户端的连接。但是,您在错误的位置设置了ReadTimeout 触发OnCommand…事件时,TId
您的做法是正确的,
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,因此将不会有任何keep-alives得到遵守,每个请求之后都会有一个断开连接。因此,您需要在OnConnect
事件中设置ReadTimeout
,以将其应用于每个连接上发送的唯一请求。但是,如果启用了KeepAlive
,并且客户端请求保持活动状态,则ReadTimeout
将应用于客户端在同一连接上发送的每个请求,尤其是第一个请求。好的,谢谢!但是,为什么您删除了答案的部分?[…],因此您的ReadTimeout值只能避免那些无法及时发送请求的缓慢/死机客户端。
。你认为,在我的例子中,“读取超时”对关闭死机/慢速连接没有用处吗?我删除了这个短语,因为在我进行编辑时,它已经不符合答案其余部分的流程。不过,它仍然适用,所以我把它放了回去。
WebServer.OnConnect := CustomOnConnect;
procedure CustomOnConnect(AContext: TIdContext);
begin
AContext.Connection.Socket.ReadTimeout := 60000;
end;