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

时间:2017-01-21 19:43:32

标签: delphi indy httpserver

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

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

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

1 个答案:

答案 0 :(得分:6)

  

现在我知道在Indy HTTP Server(TIdHTTPServer)上,TIdServerContext会重复用于从特定客户端传入的多个请求。

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

  

然而,在设计工作原理时,我需要知道多个请求是否可能使用相同的上下文类相互重叠?

没有。 Indy上下文对象是基于每个连接创建的,它们一次在一个线程上运行,并且每个连接一次处理一个HTTP 1.1和更早的请求(HTTP 2允许并行多个请求,但Indy不此时实现HTTP 2。)

  

例如,假设在浏览器中键入URL并反复按刷新。我看到的是多个上下文类被创建

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

  

但是,我担心在某个地方,可能会使用相同的上下文实例同时处理两个请求。

这是不可能的。

  

这可能发生吗?

没有

  

或者说一个实例永远不会同时处理多个请求是否安全?

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

  

我几乎可以肯定它是后者,考虑到上下文是它自己的线程

上下文不是线程。更准确地说,上下文代表一个特定的连接,恰好只由一个线程提供服务。 Indy可以重用线程(如果您将线程池调度程序分配给服务器),其中给定线程可以在其生命周期内为多个上下文提供服务。但Indy不会重复使用上下文进行多重连接。