有没有办法在 TIdHTTPServer.OnCommandGet 事件中立即发送我的回复?

Is there a way to have my response sent immediately in the TIdHTTPServer.OnCommandGet event?

对于收到的某些命令,我​​有一些任务要做,并且希望通过在执行任务时发送一些数据来防止客户端(读取)超时。

AResponseInfo 对象是否提供了实现此目的的任何东西?

我目前使用 ContentText 属性,但它在事件处理程序结束时发送数据(看起来)。

默认情况下,TIdHTTPServerOnCommand... 事件处理程序退出时发送响应。但是,可以通过以下任一方式更快地发送响应:

  • 在根据需要填充 AResponseInfo 属性后调用 AResponseInfo.WriteHeader()AResponseInfo.WriteContent() 方法。

  • 直接写入 TCP 套接字,然后将 AResponseInfo.HeaderHasBeenWritten 属性 设置为 true 这样 TIdHTTPServer 就不会尝试发送自己的响应。

注意:一旦您向客户端发送响应,客户端就可以使用相同的 TCP 连接自由发送新请求(如果使用 HTTP keep-alives),但是您将阻止连接处理这些请求请求直到您退出 OnCommand... 事件处理程序。

如果您有很长的处理时间,通常最好尽快将正常响应发送回客户端,例如使用 102 Processing 响应,退出 OnCommand... 事件handler 以便服务器重新获得对连接的控制,在后台进行实际处理,并让客户端根据需要使用后续请求查询处理状态。您可以将 cookie 或其他类型的服务器生成的 ID 分配给处理,然后让客户端将 cookie/ID 发送回服务器以查询处理的状态。