2013-04-09 5 views
7

La mia versione del server è la seguente sulla mia macchina dev:Impostazione setChunkedStreamingMode in HttpURLConnection non riesce a consegnare i dati al server

Apache/2.2.21 (Win32) mod_fcgid/2.3.6

I ho testato HttpURLConnection in quanto il mio progetto richiede facili capacità di streaming. Ho letto una grande sinossi di @BalusC su come usare la classe.

Using java.net.URLConnection to fire and handle HTTP requests

Il guaio Attualmente sto avendo è quando si imposta setChunkedStreamingMode. A prescindere da cosa l'ho impostato su , il mio stream non sembra farlo sul server il flusso di dati è vuoto quando viene chiamato/eseguito il mio metodo/connessione API server. Tuttavia, se lo rimuovo, funziona bene.

ho visto un'altra persona con un problema simile:

Java/Android HttpURLConnection setChunkedStreamingMode not working with all PHP servers

Ma senza una reale risoluzione. Non riesco a impostarlo su setFixedLengthStreamingMode semplicemente perché il contenuto (json) è di lunghezza variabile.

Questo NON è OK. Potenzialmente trasferirò grandi quantità di dati e quindi non posso avere i dati memorizzati in memoria.

La mia domanda è, come posso ottenere setChunkedStreamingMode per giocare bene? È un problema di installazione del server o può essere risolto nel codice?

EDIT Ora ho testato il mio codice sul mio server di produzione e non ha alcun problema. Mi piacerebbe comunque sapere perché il mio server Apache sul mio computer locale fallisce. Qualsiasi aiuto è ancora molto apprezzato.

+0

Definire "non sembra farlo". – EJP

+0

@EJP Hai perfettamente ragione che è davvero un pessimo giro di parole. In effetti lo fa al server, tuttavia non ci sono dati di sorta. Rispetto ad avere 'setChunkedStreamingMode' rimosso e i miei dati arrivano. Non ci sono errori neanche, per quanto posso vedere. – HGPB

+0

Grazie, ora definisci "il flusso di dati è vuoto". Come misurato come? – EJP

risposta

1

Prova ad aggiungere questa intestazione HTTP:

urlConnection.setRequestHeader("Transfer-Encoding","chunked"); 

Ho così scarse un problema come questo: anche se ho così scarse impostare la modalità di streaming HTTP chunked (urlConnection.setChunkedStreamingMode (0)), non ha funzionato, ma mettendo il HTTP l'intestazione sopra funziona perfettamente.

+7

Grazie per la risposta, questo ha lo stesso effetto dell'impostazione di 'setChunkedStreamingMode'. Nessun dato è ricevuto. Davvero molto strano davvero. Avevo già provato anche questo. Inoltre penso che la tua risposta dovrebbe leggere: 'urlConnection.setRequestProperty (" Transfer-Encoding "," chunked ")'. – HGPB

+1

È difficile credere che ciò che hai descritto abbia davvero risolto il tuo problema. 'HttpURLConnection' imposta tale intestazione se necessario. – EJP

0

Ho avuto un problema simile. Nel mio caso era il sistema client che aveva installato uno scanner antivirus. Questi scanner a volte hanno moduli di furto d'identità che intercettano POST s, scandiscono il corpo e poi lo trasmettono.

Nel mio caso BitDefender memorizzato nella cache di circa 5 MB prima di passarlo.

Se l'intero carico utile era inferiore, lo POST è stato consegnato come richiesta non fissa di lunghezza fissa.

0

Ho avuto un problema simile utilizzando HttpURLConnection.Basta aggiungere:

conn.setRequestProperty("connection", "close"); // disables Keep Alive 

per la connessione o disattivarlo per tutte le connessioni:

System.setProperty("http.keepAlive", "false"); 

Dal API sulla disconnessione():

uscite di questa connessione in modo che le risorse possano essere riutilizzato o chiuso. A differenza di altre implementazioni Java, questo non necessariamente chiude le connessioni socket che possono essere riutilizzate. È possibile disabilitare il riutilizzo di tutte le connessioni impostando la proprietà di sistema http.keepAlive su false prima di inviare richieste HTTP.