2012-01-12 9 views
5

Sto utilizzando MonoTouch per creare un'app per iPhone. Nell'app sto facendo richieste Web per recuperare informazioni dai servizi Web in esecuzione sul nostro server.Come gestisco/risolve "Errore nel ricevere il flusso di risposta (ReadDone2): ReceiveFailure" quando si utilizza MonoTouch?

Questo è il mio metodo per costruire la richiesta:

public static HttpWebRequest CreateRequest(string serviceUrl, string methodName, JsonObject methodArgs) 
{ 
    string body = ""; 

    body = methodArgs.ToString(); 

    HttpWebRequest request = WebRequest.Create(serviceUrl) as HttpWebRequest; 

    request.ContentLength = body.Length; // Set type to POST 
    request.Method = "POST"; 
    request.ContentType = "text/json"; 
    request.Headers.Add("X-JSON-RPC", methodName); 

    StreamWriter strm = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII); 
    strm.Write(body); 
    strm.Close(); 

    return request; 
} 

Poi mi chiamano così:

var request = CreateRequest(URL, METHOD_NAME, args); 
request.BeginGetResponse (new AsyncCallback(ProcessResponse), request); 

E ProcessResponse assomiglia a questo:

private void ProcessResponse(IAsyncResult result) 
{ 

    try 
    { 
     HttpWebRequest request = (HttpWebRequest)result.AsyncState; 

     using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result)) // this is where the exception gets thrown 
     { 
      using (StreamReader strm = new System.IO.StreamReader(response.GetResponseStream())) 
      { 
       JsonValue value = JsonObject.Load(strm); 

       // do stuff... 

       strm.Close(); 
      } // using 
      response.Close(); 
     } // using 

     Busy = false; 
    } 
    catch(Exception e) 
    { 
     Console.Error.WriteLine (e.Message); 
    } 
} 

C'è un altro domanda su questo problema per Monodroid e la risposta suggeriva di chiudere esplicitamente il flusso di output. Ho provato questo ma non risolve il problema. Sto ancora ricevendo un sacco di errori ReadDone2.

Al momento la mia soluzione consiste semplicemente nel reinviare la richiesta Web se si verifica un errore e il secondo tentativo sembra funzionare nella maggior parte dei casi. Questi errori si verificano solo quando eseguo il test sul telefono stesso e non si verificano mai quando si utilizza il simulatore.

+0

Quale server stai usando? –

risposta

6

Quando è possibile provare a utilizzare WebClient dal momento che si occuperà automaticamente con un sacco di dettagli (compresi i flussi). Inoltre, rende più semplice la richiesta async, che è spesso utile per non bloccare l'interfaccia utente.

E.g. WebClient.UploadDataAsync sembra un buon sostituto per quanto sopra. Otterrete i dati, quando ricevuti dall'evento UploadDataCompleted (campione here).

Inoltre sei sicuro che la tua richiesta è sempre e solo utilizzando System.Text.Encoding.ASCII? l'utilizzo di System.Text.Encoding.UTF8 viene spesso utilizzato, per impostazione predefinita, poiché rappresenterà più caratteri.

UPDATE: Se si inviano o si ricevono grandi quantità di byte [] (o stringa), allora si dovrebbe guardare con OpenWriteAsync metodo e OpenWriteCompleted evento.

+0

Non ho ancora avuto il tempo di tornare a questo. Proverò WebClient e vedrò se questo fa la differenza. –

+0

Funziona perfettamente !!! – alecnash

+1

Finalmente ho avuto la possibilità di dare un'occhiata corretta a questo. Sono passato dall'utilizzo di HttpWebRequests all'utilizzo di WebClient e dopo un po 'di riproduzione non ho visto che l'errore si verifichi finora. –

Problemi correlati