我正在使用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请求,并且在大多数情况下第二次尝试似乎都有效。这些错误只发生在我在手机上测试时,并且在使用模拟器时从未发生过。
答案 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