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.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage