Как мне обработать / исправить «Ошибка получения потока ответов (ReadDone2): ReceiveFailure» при использовании MonoTouch? - PullRequest
5 голосов
/ 12 января 2012

Я использую MonoTouch для создания приложения для iPhone. В приложении я выполняю веб-запросы для получения информации от веб-служб, работающих на нашем сервере.

Это мой метод построения запроса:

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

Тогда я называю это так:

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

И ProcessResponse выглядит так:

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

Есть еще один вопрос об этой проблеме для Monodroid, и в ответе предлагается явно закрыть поток вывода. Я пробовал это, но это не решает проблему. Я все еще получаю много ошибок ReadDone2.

В настоящее время мой обходной путь заключается в повторной отправке веб-запроса, если возникает ошибка, и в большинстве случаев вторая попытка сработает. Эти ошибки возникают только при тестировании на самом телефоне и никогда не возникают при использовании симулятора.

Ответы [ 2 ]

6 голосов
/ 12 января 2012

Когда бы ни было возможно, попробуйте использовать WebClient, поскольку он будет автоматически с большим количеством деталей (включая потоки).Это также облегчает выполнение вашего запроса async , который часто помогает не блокировать пользовательский интерфейс.

Например, WebClient.UploadDataAsync выглядит хорошей заменой вышеперечисленного,Вы получите данные, полученные от события UploadDataCompleted (пример здесь ).

Также вы уверены, что ваш запрос всегда и только с использованием System.Text.Encoding.ASCII?использование System.Text.Encoding.UTF8 часто используется по умолчанию, поскольку оно будет представлять больше символов.

ОБНОВЛЕНИЕ : если вы отправляете или получаете большое количество байтов [] (или строки), то вам следуетпосмотрите на использование OpenWriteAsync метода и OpenWriteCompleted события.

0 голосов
/ 30 ноября 2015

Это ошибка в Mono, см. https://bugzilla.xamarin.com/show_bug.cgi?id=19673

...