2012-06-20 17 views
6

Sto avendo un sacco di problemi nell'usare Webrequests in MonoDroid e ottenere timeout a caso. Il mio codice funziona bene, a volte tutte le richieste scadono e non funzionano.MonoDroid HttpWebRequest e WebClient non affidabili?

Ho verificato che i servizi Web utilizzati nelle richieste non rappresentano il problema.

Ecco un esempio di codice che posso usare per richiedere alcuni dati da un webservice utilizzando MonoDroid:

bool bolOk = false; 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create ("http://www.website.com/service/"); 
request.Timeout = 20000; 
request.Credentials = gv_objCredentials; 

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { 
    bolOk = response.StatusCode == HttpStatusCode.OK; 
} 

Come si può vedere, è roba di base. Uso il codice come sopra sempre su un altro thread per l'interfaccia utente utilizzando ThreadPool.QueueUserWorkItem o TaskFactory.

Quello che ho notato è che se le richieste iniziano a scadere dalla mia app e la collego al mio computer, allora eseguo il debug dell'applicazione da MonoDevelop, le richieste funzionano senza scadenze. Non sono sicuro se questo significhi qualcosa. Questo è simile a testare i servizi Web dal mio computer utilizzando un browser sulla stessa rete del telefono. I servizi web funzionano sempre senza problemi.

Qual è il modo migliore per eseguire Webrequest da MonoDroid?

Come posso garantire che le mie richieste abbiano sempre esito positivo e non scadano se il servizio Web funziona correttamente?

+1

Stai per caso licenziando molte richieste contemporaneamente? Ho avuto problemi in passato con varie piattaforme che non accettavano gentilmente richieste multiple simultanee, anche se non ho avuto il piacere di battere MonoDroid nello stesso modo. –

+0

Ciao Chris, Sì, potrebbe essere il caso. Sto usando questo codice su thread separati. Pensi che dovrei usare il blocco della sincronizzazione ovunque io sia in una richiesta web? – startupsmith

+1

Se questo è il caso, quindi fare un tentativo in modo da eseguire solo 1 richiesta in una sola volta. Ho anche riscontrato un problema in cui era il numero massimo di richieste (e la dimensione massima cumulativa dei byte) per frame principale dell'interfaccia utente che ha causato un problema (a causa del browser, credo). Quindi forse puoi provare a mettere le richieste in coda e chiamarle lentamente e vedere se funziona. –

risposta

1

C'è una nuova versione di Mono per Android (4.2.5) che corregge un numero di bug con WebRequest e webRequestStream. È possibile controllare le note di rilascio qui: http://docs.xamarin.com/android/Releases/Mono_For_Android_4/Mono_for_Android_4.2.5

Suggerisco di scaricare gli ultimi bit e controllare se funziona. In caso contrario, si prega di file un bug e sicuramente lo risolveranno nella prossima versione del prodotto.

2

Ho avuto il problema su Xamarin 4.2.6 e 4.2.8.

Grazie al supporto Xamarin, hanno identificato il problema e suggerito Ho scelto come destinazione la mia build per armeabi-V7A piuttosto che armeabi nei miei proprietà del progetto (qualche problema processore multi-core descritto here)

a seconda se si prevede di Supporta processori multi-core o no, dovresti controllare il nostro this post e potrebbe essere necessario modificare manualmente il tuo file .csproj.