Как избежать получения ошибки 10053 (WSAECONNABORTED), если операция HttpGet в Android длится слишком долго?
У меня есть приложение Android, связывающееся с приложением веб-службы Delphi 2006 с использованием Indy 10 TIdHttpServer (поставляется с Delphi 2006). Приложение Delphi генерирует большой XML-файл и обслуживает его. Генерация XML может длиться более 5 минут.
Если продолжительностьGenerateXml()
более 5 минут (*), я обнаружил ошибку 10053 вTIdHTTPResponseInfo.WriteContent
если работает в Delphi IDE:
Socket Error # 10053 Software caused connection abort.
Однако на стороне андроида ничего не обнаружено иHttpGet
Звонок длится вечно.
Мои вопросы:
1.) Почему я получаю ошибку 10053 и как ее избежать? Кажется, что Android истекает время соединения, ноhttp.socket.timeout
установлен на бесконечность.
а также
2.) Что я могу сделать, чтобы обнаружить такую ошибку на стороне клиента (кроме установки таймаута, который должен быть слишком большим, чтобы быть полезным)? Могу ли я сделать что-то в TIdHttpServer.OnException?
Вот мой код Android - функция загрузки, которая запускается внутри AsyncTask:
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 реализация 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;
Редактировать: (*) Я провел дополнительное тестирование и обнаружил ошибку даже в тех случаях, когда весь процесс длился менее 2 минут.