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