Indy idHttp зависает - Как работать с keep-alive?

Я разработал веб-сервер, который использует 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 перед отправкой запроса на сервер? Что еще мне нужно сделать?

Спасибо

5
задан Rafael Colucci 29 November 2011 в 19:52
поделиться