2010-01-12 17 views
16

Ho la mia app per Android che utilizza HttpClient per raggiungere il mio servlet distribuito sul mio Tomcat. È installato sul mio HTC Magic.HttpClient su Android: NoHttpResponseException tramite UMTS/3G

Se lo avvio quando connesso su Wifi: funziona. Se lo avvio quando connesso a 3G (rete dati GSM): non funziona ma viene raggiunto il mio servlet. In altre parole, sembra che il mio telefono non ha mai ottenere la risposta:

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) 

Se uso il browser web grazie alla tecnologia 3G per attivare la pagina di prova HTML che viene fornito con il mio servlet, raggiunge lo stesso servlet con successo (la pagina riceve la risposta).

Come è possibile eseguire il debug di HttpClient o chiedere di scaricare tutto?

Qualcuno ha idea di cosa sta succedendo?

+0

Avete controllato i registri del server per vedere se la richiesta sta effettuando la connessione? In tal caso, i tuoi registri ti dicono qualcosa (ad esempio, errore lato server)? – CommonsWare

+0

Il server riceve la richiesta (molto rapidamente) e dà una risposta con successo, nello stesso modo in cui lo fa per la richiesta che arriva quando si utilizza il wifi. Sarebbe più efficiente riuscire a eseguire il debug di HttpClient ... L'eccezione viene lanciata dopo molto tempo, più o meno 10 minuti, quindi suppongo, non ci sia davvero nulla che ritorni sul dispositivo. Se è vero, qualcosa sta perdendo la mia risposta nell'aria. La mia rete GSM potrebbe avere qualche filtro? – Hubert

+0

È interessante notare che su proxy.cwg.net è installato un server calamaro che sembra essere la causa. Ma perché funziona con la pagina HTML di test e non con HttpClient nella stessa condizione? – Hubert

risposta

11

ho finalmente sono liberato di questo problema: semplicemente un'intestazione HTTP che è stato mal gestito da un server calamaro sulla strada:

Expect: 100-Continua

sembra di essere lì di default con DefaultHttpClient su Android SDK. Per affrontare questo, è sufficiente aggiungere che nel codice:

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

mi sono imbattuto in questo problema pure. Si è verificato solo sporadicamente, di solito su una richiesta http iniziale. Le richieste successive funzionerebbero bene. L'aggiunta di setUseExpectContinue non sembra funzionare.

La soluzione nel mio caso è stato quello di aggiungere un gestore di tentativi che ritentare la richiesta su specifiche eccezioni:

 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); 
+0

Questo è esattamente il problema che sto avendo .. sfortunatamente, il server riceve la prima richiesta e cambia qualche stato .. inviando di nuovo quella stessa richiesta davvero bucks .. – danb

+0

@PTG Non funziona nel mio caso. Ho impostato max executionCount su 50 per verificare se funziona dopo così tanti tentativi. Ma non è stato così. Qualche altra idea? A proposito, lo uso con proxy e quindi solo ottenendo questa eccezione. – Geek

Problemi correlati