How do I handle/fix “Error getting response stream

2019-05-01 17:28发布

问题:

I am using MonoTouch to build an iPhone app. In the app I am making Web Requests to pull back information from the web services running on our server.

This is my method to build the request:

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

Then I call it like this:

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

And ProcessResponse looks like this:

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

There is another question about this issue for Monodroid and the answer there suggested explicitly closing the output stream. I tried this but it doesn't solve the problem. I am still getting a lot of ReadDone2 errors occurring.

My workaround at the moment involves just re-submitting the Web Request if an error occurs and the second attempt seems to work in most cases. These errors only happen when I am testing on the phone itself and never occur when using the Simulator.

回答1:

Whenever possible try to use WebClient since it will deal automatically with a lot of details (including streams). It also makes it easier to make your request async which is often helpful for not blocking the UI.

E.g. WebClient.UploadDataAsync looks like a good replacement for the above. You will get the data, when received from the UploadDataCompleted event (sample here).

Also are you sure your request is always and only using System.Text.Encoding.ASCII ? using System.Text.Encoding.UTF8 is often usedm, by default, since it will represent more characters.

UPDATE: If you send or receive large amount to byte[] (or string) then you should look at using OpenWriteAsync method and OpenWriteCompleted event.



回答2:

This is a bug in Mono, please see https://bugzilla.xamarin.com/show_bug.cgi?id=19673