具有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;
答案 0 :(得分:2)
要完全停用服务器,您只需要将服务器的Active
属性设置为False。这将阻止服务器侦听新的连接,并关闭所有当前活动的连接。无需手动关闭客户端连接,也无需清除活动的“纱线”列表。 Active
设置器将为您处理所有事情:
procedure TRPSystem.ServerStop;
begin
Main.Server.Active := false;
end;
否则,如果您不想完全停用服务器,只需使其暂时脱机即可,则可以使用OnHeadersAvailable
和OnHeadersBlocked
事件拒绝新的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;