HttpClient на Android: NoHttpResponseException через UMTS/3G

У меня есть приложение для Android, которое использует HttpClient для достижения моего сервлета развернутый на моем Tomcat. Он установлен на моей HTC Magic.

Если я запускаю его при подключении к Wi-Fi: он работает. Если я запустил его при подключении к сети передачи данных 3G (GSM): он не работает, но мой сервлет достигнут. Другими словами, кажется, что мой телефон никогда не получает ответа:

Technical problem while receiving response.
org.apache.http.NoHttpResponseException: The target server failed to respond
   at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:85)
   at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174)
   at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:179)
   at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235)
   at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259)
   at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)
   at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121)
   at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:410)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)

Если я использую веб-браузер через 3G для активации тестовой HTML-страницы, упакованной с моим сервлетом, он достигает того же самого сервлета с успехом (страница получает ответ).

Как мне отладить HttpClient или попросить его сбросить все?

Кто-нибудь знает, что происходит?

Ответы

Ответ 1

Я, наконец, избавился от этой проблемы: просто HTTP-заголовок, плохо обработанный сервером squid на дороге:

Ожидайте: 100-Продолжить

Кажется, что он по умолчанию с DefaultHttpClient на Android SDK. Чтобы решить эту проблему, просто добавьте это в свой код:

  HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false);

Ответ 2

Я столкнулся с этой проблемой. Это происходило только эпизодически, как правило, при первоначальном HTTP-запросе. Последующие запросы будут работать нормально. Добавление setUseExpectContinue, похоже, не работает.

Решение в моем случае состояло в том, чтобы добавить обработчик повтора, который будет повторять запрос по конкретным исключениям:

        HttpProtocolParams.setUseExpectContinue(client.getParams(), false);

        HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {

            public boolean retryRequest(IOException exception, int executionCount,
                    HttpContext context) {
                // retry a max of 5 times
                if(executionCount >= 5){
                    return false;
                }
                if(exception instanceof NoHttpResponseException){
                    return true;
                } else if (exception instanceof ClientProtocolException){
                    return true;
                } 
                return false;
            }
        };
        client.setHttpRequestRetryHandler(retryHandler);

Ответ 3

У Android была ошибка, когда HTTPS делал обратные DNS-запросы (исправлено в сэндвиче с мороженым)

http://code.google.com/p/android/issues/detail?id=13117 упомянул работу, которая работает на моем телефоне.