Indy TIdhttp 구성 요소를 사용하여 간단한 웹 사이트 모니터링 응용 프로그램을 만들었습니다. 지정된 페이지가 지정된 시간 프레임 내에 반환되지 않은 경우 (5000 밀리 초 사용 중) 감지하고 싶습니다. 테스트로서 나는 의도적으로 응답하는데 15 초가 걸린 웹 사이트에 페이지를 만들었습니다. 그러나 5 초 후에 내 시술을 "포기"할 수는 없습니다. 내가 타이머와 OnWorkBegin 이벤트를 사용 에게 ReadTimeout하는 suggested solution을 시도합니다 (GET 호출 후 즉시 해고 OnWorkBegin을 얻을 수 없었어).Indy Tidhttp에 대한 응답 시간 제한을 설정하는 방법이 있습니까?
참고 연결 시간 제한에 대해 걱정하지 않습니다. 내 관심사는 서버가 페이지를 반환하는 시간 초과입니다.
다음은 내가 사용 해본 일부 소스 코드입니다. 여기에는 내가 참조하는 많은 요소가 포함되어 있습니다.
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;
참고 사항 : [Indy를 사용하는 동안 연결이 시간 초과되지 않습니다.] (http://stackoverflow.com/questions/3187446/the-connection-does-not-timeout-while-using-indy). –
TTimer를 사용하는 논리가 비동기식 TIdHTTP를 예상합니다. –
Rob Kennedy가 제안한 기사를 살펴 보았습니다. 스레드 유형 솔루션을 만들었습니다. 내 스레드를 관리하기 위해 주 응용 프로그램에 TStringList를 만들었습니다. 나는 또한 5 초마다 발사하는 타이머를 가지고있다. 따라서 5 초 내에 "완료"되지 않은 스레드가 표시되면 스레드의 Terminate 메서드를 호출합니다. 그러나 이것은 내가 원하는대로 즉시 "종결"하는 것처럼 보이지 않습니다. 여전히 기다리고있는 것 같습니다. –