Есть ли способ установить время ожидания ответа для Indy Tidhttp gets?


Я построил простое приложение для мониторинга веб-сайтов, используя компонент Indy TIdhttp. Я хочу определить, когда назначенная страница не возвращается в течение указанного периода времени (я использую 5000 миллисекунд). В качестве теста я создал страницу на веб-сайте, которая намеренно занимает 15 секунд, чтобы ответить. Но я не могу заставить свою процедуру "сдаться" после 5 секунд. Я попробовал ReadTimeout , предлагаемое решение с использованием таймера и события OnWorkBegin (никогда не было возможность получить OnWorkBegin для запуска сразу после вызова get).

Примечание я не беспокоюсь о таймауте соединения. Меня беспокоит здесь тайм-аут для сервера, чтобы вернуться со страницей.

Вот некоторый исходный код, который я использую. Он содержит много элементов, на которые я ссылаюсь.

procedure TServLogic.WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
  GetTimer.Enabled := True;
end;
procedure TServLogic.WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  GetTimer.Enabled := False;
end;

procedure TServLogic.GetTimerTimer(Sender: TObject);
begin
  idHttp.Disconnect(True);
end;

procedure TServLogic.CallHttp(mlink: String): String;
begin
  result := '';
  GetTimer := TTimer.create(nil);
  GetTimer.OnTimer := GetTimerTimer;
  GetTimer.Interval := 5000;
  try
    IdHTTP := TIdHTTP.create(nil);
    idhttp.ReadTimeout := 5000;
    IdHttp.OnWorkBegin := WorkBegin;
    IdHttp.OnWorkEnd   := WorkEnd;
    try
      result  := idhttp.get(mLink);
    except
      on e:exception do begin
        AppendToLog('Server did not respond withing 5 seconds');
      end;
    end;
  finally
    GetTimer.Free;
    idhttp.free;
  end;
end;
2 8

2 ответа:

В конце концов я получил ответ, основанный на комментариях Роба Кеннеди. Я много раз пытался связаться с ним и попросить его дать "формальный" ответ, чтобы я мог дать ему право голоса. Никогда не слышал назад.

Это не ответ на конкретный вопрос выше, но так как именно здесь Google берет вас, если вы ищете "indy http timeout", упомянем здесь, что вы можете установить эти свойства:

TIdHTTP.ReadTimeout
TIdHTTP.ConnectTimeout