轻松计时 Indy 连接和接收时间的方法?

Easy to way to time Indy connect and receive times?

TIdHTTP.Get()TIdHTTP.Put() 操作中,是否有一种简单的方法来获取 Indy 连接所花费的时间以及接收数据所花费的时间?

编辑:
我想获取统计信息以确定哪些超时最适合用于 ReceiveTimeoutConnectTimeOut 属性。

要为连接计时,您可以使用 OnStatus(hsConnecting)OnStatus(hsConnected)/OnConnected 事件。请注意,如果 URL 涉及主机名(这是通常的情况),那么在 OnStatus(hsConnecting) 事件之前还有一个 OnStatus(hsResolving) 事件。但是,此时 DNS 解析不影响 ConnectTimeout 处理。

对于接收的计时,这有点棘手,因为没有检测发送请求结束的事件,或者 beginning/ending 读取响应 1.而且给定的 HTTP 请求可能涉及多个步骤(重定向、身份验证等),这也可能涉及多个 disconnects/re-connects,因为 HTTP 是一种无状态协议,不依赖于持久连接,就像大多数其他协议一样。因此,我能想到的实现此目的的唯一方法是将 Intercept 组件附加到 TIdHTTP.Intercept 属性,然后在交换 HTTP 消息时手动解析它们。

  • 1 实际上,这并不 完全 正确。有一个 TIdHTTP.OnHeadersAvailable 事件,它在读取 HTTP 响应 headers 之后,至少在读取 HTTP 响应 body 之前触发。因此,如果您不关心 headers 的计时,您至少可以使用该事件开始计时接收 body 数据。然后在Get()/Post()退出时停止计时。对于每个需要 TIdHTTP 重复请求的 multi-step,你应该得到一个新的 OnHeadersAvailable 事件,你可以用它来重置你的计时器。这样,您最终只得到最终响应的时间。

但是,请注意 ReceiveTimeoutper-byte 超时,因此替代方法可能是使用自定义 TStream(或 Indy 的TIdEventStream) 以接收 HTTP 响应数据,然后您可以通过覆盖其 Write() 方法(或使用 OnWrite 事件)来计算对该流的各个写入之间的持续时间。