2012-01-12 81 views
5

我使用MonoTouch的構建iPhone應用程序。在應用程序中,我正在使Web請求從我們的服務器上運行的Web服務撤回信息。如何處理/修復「錯誤獲取響應流(ReadDone2):ReceiveFailure」使用MonoTouch的時候?

這是我的方法來構造請求:

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

哪個服務器您使用的? – 2012-01-12 14:32:24

回答

6

儘可能地嘗試使用WebClient,因爲它會自動處理以及許多細節(包括流)。這也使得它更容易讓你的要求異步這一點常常是不阻塞UI有幫助的。

E.g. WebClient.UploadDataAsync看起來像是上面的一個很好的替代品。你會得到的數據,從UploadDataCompleted事件(樣品here)收到時。

您是否確定自己的請求是總是並且只能使用System.Text.Encoding.ASCII?使用System.Text.Encoding.UTF8通常默認使用,因爲它會代表更多的字符。

UPDATE:如果你發送或接收大量爲byte [](或字符串),那麼你應該看看使用OpenWriteAsync方法和OpenWriteCompleted事件。

+0

我還沒有時間回來呢。我會嘗試WebClient,看看這是否有所作爲。 – 2012-01-19 02:41:38

+0

完美的作品! – alecnash 2012-03-20 12:28:25

+1

終於有機會正確看待這個。我已經使用HttpWebRequests使用Web客戶端和一點打我還沒有看到這個錯誤後改變發生迄今。 – 2012-04-02 06:39:07

相關問題