轻松计时 Indy 连接和接收时间的方法?
Easy to way to time Indy connect and receive times?
在 TIdHTTP.Get()
或 TIdHTTP.Put()
操作中,是否有一种简单的方法来获取 Indy 连接所花费的时间以及接收数据所花费的时间?
编辑:
我想获取统计信息以确定哪些超时最适合用于 ReceiveTimeout
和 ConnectTimeOut
属性。
要为连接计时,您可以使用 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
事件,你可以用它来重置你的计时器。这样,您最终只得到最终响应的时间。
但是,请注意 ReceiveTimeout
是 per-byte 超时,因此替代方法可能是使用自定义 TStream
(或 Indy 的TIdEventStream
) 以接收 HTTP 响应数据,然后您可以通过覆盖其 Write()
方法(或使用 OnWrite
事件)来计算对该流的各个写入之间的持续时间。
在 TIdHTTP.Get()
或 TIdHTTP.Put()
操作中,是否有一种简单的方法来获取 Indy 连接所花费的时间以及接收数据所花费的时间?
编辑:
我想获取统计信息以确定哪些超时最适合用于 ReceiveTimeout
和 ConnectTimeOut
属性。
要为连接计时,您可以使用 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
事件,你可以用它来重置你的计时器。这样,您最终只得到最终响应的时间。
但是,请注意 ReceiveTimeout
是 per-byte 超时,因此替代方法可能是使用自定义 TStream
(或 Indy 的TIdEventStream
) 以接收 HTTP 响应数据,然后您可以通过覆盖其 Write()
方法(或使用 OnWrite
事件)来计算对该流的各个写入之间的持续时间。