2012-01-12 11 views
5

Estoy usando MonoTouch para construir una aplicación de iPhone. En la aplicación realizo solicitudes web para recuperar información de los servicios web que se ejecutan en nuestro servidor.¿Cómo manejo/arreglo "Error al obtener la secuencia de respuesta (ReadDone2): ReceiveFailure" cuando se usa MonoTouch?

Este es mi método para construir la solicitud:

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; 
} 

Entonces me llaman así:

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

Y ProcessResponse se parece a esto:

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); 
    } 
} 

Hay otro pregunta sobre este tema para Monodroid y la respuesta allí sugirió cerrar explícitamente el flujo de salida. Intenté esto pero no resuelve el problema. Todavía estoy recibiendo muchos errores de ReadDone2.

Mi solución en este momento implica simplemente volver a enviar la solicitud web si se produce un error y el segundo intento parece funcionar en la mayoría de los casos. Estos errores solo ocurren cuando estoy realizando pruebas en el teléfono y nunca aparecen cuando uso el simulador.

+0

Qué servidor está usando? –

Respuesta

6

Siempre que sea posible, intente utilizar WebClient ya que tratará automáticamente con muchos detalles (incluidas las transmisiones). También hace que sea más fácil hacer su pedido async que a menudo es útil para no bloquear la IU.

E.g. WebClient.UploadDataAsync parece un buen reemplazo para lo anterior. Obtendrá los datos cuando los reciba del evento UploadDataCompleted (muestra here).

También está seguro de que su solicitud es siempre y solo usando System.Text.Encoding.ASCII? usar System.Text.Encoding.UTF8 a menudo se usam, de forma predeterminada, ya que representará más caracteres.

ACTUALIZACIÓN: Si envía o recibe gran cantidad de byte [] (o cadena), entonces usted debe buscar en el uso OpenWriteAsync método y OpenWriteCompleted evento.

+0

No he tenido tiempo de volver a esto todavía. Voy a probar WebClient y ver si esto hace la diferencia. –

+0

¡Funciona perfectamente! – alecnash

+1

Finalmente tuve la oportunidad de echarle un vistazo adecuado a esto. He cambiado de usar HttpWebRequests a usar WebClient y después de jugar un poco, no he visto ese error hasta ahora. –

Cuestiones relacionadas