2012-01-12 12 views
5

मैं एक आईफोन ऐप बनाने के लिए मोनो टच का उपयोग कर रहा हूं। ऐप में मैं अपने सर्वर पर चल रही वेब सेवाओं से जानकारी वापस खींचने के लिए वेब अनुरोध कर रहा हूं।मैं मोनो टच का उपयोग करते समय "प्रतिक्रिया स्ट्रीम प्राप्त करने में त्रुटि (ReadDone2): प्राप्त करें विफलता" को कैसे संभाल/ठीक कर सकता हूं?

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

एक और है

यह अनुरोध बनाने के लिए अपनी पद्धति है मोनोड्रॉइड के लिए इस मुद्दे के बारे में सवाल और उत्तर में आउटपुट स्ट्रीम को स्पष्ट रूप से बंद करने का सुझाव दिया गया। मैंने कोशिश की लेकिन यह समस्या का समाधान नहीं करता है। मुझे अभी भी बहुत सारी ReadDone2 त्रुटियां मिल रही हैं।

इस समय मेरे कार्यवाही में वेब अनुरोध को दोबारा सबमिट करना शामिल है यदि कोई त्रुटि होती है और दूसरा प्रयास ज्यादातर मामलों में काम करता है। ये त्रुटियां केवल तभी होती हैं जब मैं फोन पर परीक्षण कर रहा हूं और सिम्युलेटर का उपयोग करते समय कभी नहीं होता।

+0

कौन सा सर्वर आप उपयोग कर रहे हैं? –

उत्तर

6

जब भी संभव हो WebClient का उपयोग करने का प्रयास करें क्योंकि यह स्वचालित रूप से को बहुत से विवरण (धाराओं सहित) के साथ सौदा करेगा। यह आपके अनुरोध को async बनाना आसान बनाता है जो अक्सर यूआई को अवरुद्ध करने के लिए सहायक नहीं होता है।

उदा। WebClient.UploadDataAsync उपरोक्त के लिए एक अच्छा प्रतिस्थापन की तरह दिखता है। UploadDataCompleted ईवेंट (नमूना here) से प्राप्त होने पर आपको डेटा प्राप्त होगा।

क्या आप भी सुनिश्चित हैं कि आपका अनुरोध हमेशा और केवल System.Text.Encoding.ASCII का उपयोग कर रहा है? System.Text.Encoding.UTF8 का उपयोग अक्सर डिफ़ॉल्ट रूप से किया जाता है, क्योंकि यह अधिक वर्णों का प्रतिनिधित्व करेगा।

अद्यतन: आप भेज सकते हैं या [] (या स्ट्रिंग) बाइट के लिए बड़ी राशि प्राप्त करते हैं तो आप OpenWriteAsync विधि और OpenWriteCompleted घटना का उपयोग करने में दिखना चाहिए।

+0

मेरे पास अभी तक वापस आने का समय नहीं है। मैं वेब क्लाइंट को आज़माउंगा और देख सकता हूं कि इससे कोई फर्क पड़ता है या नहीं। –

+0

पूरी तरह से काम करता है !!! – alecnash

+1

अंततः इस पर एक उचित नजर रखने का मौका मिला। मैं WebClient का उपयोग करने के लिए HttpWebRequests का उपयोग करने से बदल गया हूं और कुछ खेलने के बाद मैंने नहीं देखा है कि त्रुटि अब तक होती है। –

संबंधित मुद्दे

 संबंधित मुद्दे