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

Я использую 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.

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

5
задан Adam Jones 12 January 2012 в 05:43
поделиться