如何关闭idHTTPServer上的所有连接?

时间:2019-01-29 16:22:24

标签: delphi indy

具有idHTTPServer并希望它停止接收请求。正确的做法是什么?

我不确定下面的代码

function TRPSystem.CloseAllConnections: boolean;
var
  i: Integer;
  l: TList;
  c: TIdThreadSafeObjectList;

begin
  Result := false;
  c := Main.Server.Contexts;
  if c = nil then
    Exit();

  l := c.LockList();

  try
    for i := 0 to  l.Count - 1 do
      TIdContext(l.Items[i]).Connection.Disconnect(False);
    Result := true;
  finally
    c.UnlockList;
  end;
end;

procedure TRPSystem.ServerStop;
begin
  CloseAllConnections();
  Main.Server.Scheduler.ActiveYarns.Clear; 
  Main.Server.IsActive := false;
end;

1 个答案:

答案 0 :(得分:2)

要完全停用服务器,您只需要将服务器的Active属性设置为False。这将阻止服务器侦听新的连接,并关闭所有当前活动的连接。无需手动关闭客户端连接,也无需清除活动的“纱线”列表。 Active设置器将为您处理所有事情:

procedure TRPSystem.ServerStop;
begin
  Main.Server.Active := false;
end;

否则,如果您不想完全停用服务器,只需使其暂时脱机即可,则可以使用OnHeadersAvailableOnHeadersBlocked事件拒绝新的HTTP请求。从OnHeadersAvailable返回False,然后从OnHeadersBlocked返回合适的状态码,例如 503 Service Unavailable(默认为403 Forbidden),例如:

procedure TMain.ServerHeadersAvailable(AContext: TIdContext; const AUri: string; AHeaders: TIdHeaderList; var VContinueProcessing: Boolean);
begin
  if Offline then
    VContinueProcessing := False;
end;

procedure TMain.ServerHeadersBlocked(AContext: TIdContext; AHeaders: TIdHeaderList; var VResponseNo: Integer; var VResponseText, VContentText: String);
begin
  VResponseNo := 503;
end;