Ich habe eine einfache Website-Monitoring-Anwendung mit Indy TIdhttp-Komponente gebaut. Ich möchte feststellen, wenn eine bestimmte Seite nicht innerhalb eines bestimmten Zeitraums zurückgegeben wird (ich verwende 5000 Millisekunden). Als Test habe ich eine Seite auf einer Website erstellt, die absichtlich 15 Sekunden für die Antwort benötigt. Aber ich kann meine Prozedur nicht dazu bringen, nach den 5 Sekunden aufzugeben. Ich habe versucht, Readtimeout, ein suggested solution mit Hilfe einer Zeitschaltuhr und die OnWorkBegin Ereignis (war nie in der Lage OnWorkBegin zu erhalten unmittelbar nach dem Anruf erhalten zu feuern).Gibt es eine Möglichkeit, Antwort-Timeout für Indy Tidhttp wird gesetzt?
Hinweis Ich bin nicht besorgt über eine Verbindung Zeitüberschreitung. Meine Sorge hier ist eine Zeitüberschreitung für den Server, um mit einer Seite zurückzukehren.
Hier ist ein Quellcode, den ich benutzt habe. Es enthält viele der Elemente, die ich referenziere.
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;
Siehe auch: [Die Verbindung Timeout nicht während der Verwendung von Indy] (http://stackoverflow.com/questions/3187446/the-connection-does-not-timeout-while-using-indy). –
Ihre Logik mit TTimer erwartet asynchrone TIdHTTP, die nicht wahr –
Blick auf den Artikel von Rob Kennedy vorgeschlagen. Ich habe eine Lösung vom Threadtyp erstellt. Erstellt eine TStringList in der Hauptanwendung, um meine Threads zu verwalten. Ich habe auch einen Timer, der alle 5 Sekunden feuert. Wenn ich also einen Thread sehe, der nicht innerhalb von 5 Sekunden "beendet" hat, rufe ich die Terminate-Methode des Threads auf. Aber das scheint es nicht so zu "beenden", wie ich es will; es scheint immer noch zu warten. –