TIdServerContext 是否可以同时使用多次?

Is it possible for a TIdServerContext to be used more than once at the same time?

现在我知道在 Indy HTTP Server (TIdHTTPServer) 上,TIdServerContext 被重新用于来自特定客户端的多个请求。但是,在设计工作方式时,我需要知道是否有可能多个请求可以使用相同的上下文相互重叠 class?

例如,假设在浏览器中键入 URL 并反复按刷新。我看到的是创建了多个上下文 classes。但是,恐怕在某个地方,可能会使用同一个上下文实例同时处理两个请求。

这有可能发生吗?或者说一个实例永远不会同时处理多个请求是否安全?我几乎可以肯定是后者,考虑到上下文是它自己的线程,但我需要确定。

Now I know that on an Indy HTTP Server (TIdHTTPServer), the TIdServerContext is re-used for multiple requests incoming from a particular client.

仅当客户端和服务器使用 HTTP keep-alives 时,才能通过单个 TCP 连接发送多个请求。否则,连接在每次响应后关闭。

However, while designing how things work, I need to know whether it is possible that multiple requests could overlap each other using the same context class?

没有。 Indy 上下文对象是在 per-connection 的基础上创建的,它们一次在单个线程上 运行,并且 HTTP 1.1 和更早版本的请求在每个连接中一次处理一个(HTTP 2 允许多个请求并行,但 Indy 目前未实现 HTTP 2)。

For example, imagine typing a URL in a browser and pressing refresh over and over. What I see happen is multiple context classes get created

刷新时,浏览器将关闭当前连接并创建一个新连接。关闭连接是取消尚未完成的挂起请求的唯一方法。

However, I'm afraid that somewhere, the same context instance might be used to handle two requests at the same time.

那是不可能的。

Is it possible for that to happen?

没有

Or is it safe to say that one instance will never process multiple requests at the same time?

是的。它可能在其生命周期内处理多个请求,但不能并行处理。

I'm almost sure it's the latter, considering the context is its own thread

上下文不是线程。更准确地说,上下文代表一个特定的连接,它恰好只由一个线程提供服务。 Indy 可以 re-use 个线程(如果您为服务器分配 thread-pooling 个调度程序),其中一个给定的线程可以在其生命周期内服务多个上下文。但是 Indy 没有 re-use 多个连接的上下文。