Я разработал веб-сервер, который использует idHttpServer
, и клиентское приложение, использующее idHTTP
.
Я использую Delphi 2010 и последний исходный код indy svn из ствола.
Это приложение отправляет около 1000 запросов к веб-серверу в цикле. Из-за TIME_WAITS
и накладных расходов на подключение к веб-серверу мне нужно использовать keep-alive
. Проблема в следующем: после выполнения около 700 запросов к серверу мое приложение (клиентская сторона) зависает почти на 10 минут при отправке данных на веб-сервер (что случается почти каждый раз).
Итак, мне нужно знать, как правильно использовать keep-alive с indy.
Пока у меня есть этот код:
На стороне клиента:
oIndyHttpClient := TIdHTTP.Create(nil);
oIndyHttpClient.ProxyParams.Clear;
oIndyHttpClient.Request.CacheControl := 'no-cache';
oIndyHttpClient.ProtocolVersion := pv1_1;
oIndyHttpClient.HTTPOptions := oIndyHttpClient.HTTPOptions + [hoKeepOrigProtocol];
oIndyHttpClient.ReuseSocket := rsOSDependent;
oIndyHttpClient.Request.Connection := 'keep-alive';
И на стороне сервера:
oIdHttpServer.OnCommandGet := Self.OnClientRead;
oIdHttpServer.AutoStartSession := False;
oIdHttpServer.KeepAlive := False;
procedure TPLKWSServerSocketIndy.OnClientRead(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
//do some stuff here
if LowerCase(ARequestInfo.Connection) = 'keep-alive' then begin
AResponseInfo.CloseConnection := False;
end
else begin
AResponseInfo.CloseConnection := True;
end;
end;
Правильно ли я делаю? Что может быть причиной зависания клиентского приложения и не выполнения почтового запроса?
Я пытался выполнить отладку сервера, когда клиент завис, но метод OnClientRead
не запускался. Мне кажется, что у клиента проблемы с подключением к веб-серверу.
Если я изменю код клиента на:
oIndyHttpClient.ProtocolVersion := pv1_0;
oIndyHttpClient.Request.Connection := 'close';
Клиентское приложение не зависает, и все работает нормально.
Следует очистить IOHandler.InputBuffer
перед отправкой запроса на сервер? Что еще мне нужно сделать?
Спасибо