当使用MonoTouch时,如何处理/修复“获取响应流(ReadDone2)时出错:ReceiveFailure”?

时间:2012-01-12 05:43:59

标签: iphone mono httpwebrequest xamarin.ios

我正在使用MonoTouch构建iPhone应用程序。在应用程序中,我正在制作Web请求以从我们服务器上运行的Web服务中提取信息。

这是构建请求的方法:

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错误。

我目前的解决方法是在发生错误时重新提交Web请求,并且在大多数情况下第二次尝试似乎都有效。这些错误只发生在我在手机上测试时,并且在使用模拟器时从未发生过。

2 个答案:

答案 0 :(得分:6)

尽可能尝试使用WebClient,因为它会自动处理 包含很多细节(包括流)。它还可以更轻松地发出请求异步,这通常有助于不阻止用户界面。

E.g。 WebClient.UploadDataAsync看起来像是上述的一个很好的替代品。从UploadDataCompleted事件(示例here)收到数据时,您将获得数据。

您确定总是并且仅使用System.Text.Encoding.ASCII吗?默认情况下,经常使用System.Text.Encoding.UTF8,因为它代表更多字符。

更新:如果您向byte [](或字符串)发送或接收大量数据,那么您应该查看使用OpenWriteAsync方法和OpenWriteCompleted事件。

答案 1 :(得分:0)

这是Mono中的错误,请参阅https://bugzilla.xamarin.com/show_bug.cgi?id=19673