Wie vermeide ich den Fehler 10053 (WSAECONNABORTED), wenn ein HttpGet-Vorgang in Android zu lange dauert?
Ich habe eine Android-Anwendung, die mit einer Delphi 2006-Webdienstanwendung unter Verwendung von Indy 10 TIdHttpServer (im Lieferumfang von Delphi 2006 enthalten) kommuniziert. Die Delphi-Anwendung generiert eine große XML-Datei und stellt diese zur Verfügung. Die XML-Generierung kann länger als 5 Minuten dauern.
Wenn die Dauer vonGenerateXml()
Wenn der Vorgang länger als 5 Minuten dauert (*), stelle ich einen Fehler 10053 in festTIdHTTPResponseInfo.WriteContent
Wenn Sie in der Delphi-IDE ausgeführt werden:
Socket Error # 10053 Software caused connection abort.
Auf der Android-Seite wird jedoch nichts erkannt und dieHttpGet
-Anruf dauert für immer.
Meine Fragen sind:
1.) Warum erhalte ich den Fehler 10053 und wie kann ich ihn vermeiden? Es scheint, als würde Android die Verbindung abbrechen, aberhttp.socket.timeout
ist auf unendlich gesetzt.
und
2.) Was kann ich tun, um einen solchen Fehler auf der Clientseite zu erkennen (außer Timeout einzustellen, was zu groß sein müsste, um nützlich zu sein)? Kann ich etwas in TIdHttpServer.OnException tun?
Hier ist mein Code. Android - Download-Funktion, die in einer AsyncTask ausgeführt wird:
protected static HttpEntity downloadEntity(String url) throws IOException {
HttpClient client = new DefaultHttpClient();
//Check because of Error 10053: but timeout is null -> infinite
Log.d("TAG", "http.socket.timeout: " + client.getParams().getParameter("http.socket.timeout"));
HttpGet get = new HttpGet(url);
HttpResponse response;
try {
//in case of Error 10053 the following call seems to last forever (in PlainSocketImpl.read)
response = client.execute(get);
} catch (ClientProtocolException e) {
//...
}
//...
return response.getEntity();
}
Delphi-Implementierung von TIdHttpServer.OnCommandGet:
procedure ServeXmlDoc(XmlDoc: IXMLDocument; ResponseInfo: TIdHTTPResponseInfo);
var
TempStream: TMemoryStream;
begin
ResponseInfo.ContentType := 'text/xml';
TempStream := TMemoryStream.Create;
XMLDoc.SaveToStream(TempStream);
ResponseInfo.FreeContentStream := True;
ResponseInfo.ContentStream := TempStream;
end;
procedure TMyService.HTTPServerCommandGet(AContext: TIdContext; RequestInfo: TIdHTTPRequestInfo;
ResponseInfo: TIdHTTPResponseInfo);
begin
Coinitialize(nil);
try
//...
ServeXmlDoc(GenerateXml(), ResponseInfo);
finally
CoUninitialize;
end;
end;
Bearbeiten: (*) Ich habe weitere Tests durchgeführt und den Fehler selbst in Fällen festgestellt, in denen der gesamte Vorgang weniger als 2 Minuten dauerte.