2012-06-08 21 views
6

से शुरू होता है मेरे पास एक पृष्ठभूमि कार्यकर्ता धागा है जो लगातार दूरस्थ सर्वर से डेटा को समन्वयित कर रहा है। जब मैं पहली बार ऐप चलाता हूं, तो सबकुछ ठीक काम करता प्रतीत होता है। यह हर 30 सेकंड के बारे में वेब अनुरोध करता है और डेटा सफलतापूर्वक लौटाता है।HTTPWebRequest और थोड़ी देर के बाद, 400 (खराब अनुरोध)

यदि मैं लंबे समय तक सिम्युलेटर चल रहा हूं, तो अंततः अनुरोध (400) खराब अनुरोध के साथ विफल हो जाएगा। और बाद के सभी अनुरोध एक ही काम करते हैं। अगर मैं ऐप को मारता हूं और इसे पुनरारंभ करता हूं ... सब ठीक है।

किसी के पास कोई विचार है? कोड नीचे है।

public RestResponse<T> Execute<T>(RestRequest request) { 
    var restResponse = new RestResponse<T>(); 
    var serializer = new JavaScriptSerializer(); 
    var urlPath = baseUrl + "/" + request.Resource; 
    Console.WriteLine("Requesting: " + urlPath); 
    var httpRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri(urlPath)); 

    httpRequest.Headers = request.Headers; 
    foreach (string key in clientHeaders.Keys) 
     httpRequest.Headers.Add(key, clientHeaders[key]); 
    httpRequest.Headers.Add("Accept-Encoding", "gzip,deflate"); 

    Authenticator.Authenticate(httpRequest); 
    httpRequest.Method = request.Method.ToString();  
    HttpWebResponse httpResponse = null; 
    try { 
     if ((request.Method == Method.POST) && (!request.IsJsonPost)) 
      SetPostData(httpRequest, request); 

     if ((request.Method == Method.POST) && (request.IsJsonPost)){ 
      SetJsonPostData(httpRequest, request); 
     } 

     httpResponse = (HttpWebResponse)httpRequest.GetResponse(); 
     var reader = new StreamReader(GetStreamForResponse(httpResponse)); 
     var responseString = reader.ReadToEnd(); 
     Console.WriteLine(responseString); 
     reader.Close(); 
     restResponse.StatusCode = httpResponse.StatusCode; 
     restResponse.Headers = httpResponse.Headers; 
     restResponse.Data = serializer.Deserialize<T>(responseString); 
     restResponse.ResponseStatus = ResponseStatus.Completed; 
     httpResponse.Close(); 
    } catch (WebException e) { 
     restResponse.ResponseStatus = ResponseStatus.Error; 
     restResponse.ErrorMessage = e.Message; 
     restResponse.ErrorException = e; 
     var webResponse = (HttpWebResponse)e.Response; 
     if (webResponse != null) { 
      restResponse.StatusCode = webResponse.StatusCode; 
      restResponse.Headers = webResponse.Headers; 
     } 
     if (restResponse.StatusCode != HttpStatusCode.NotModified) 
      Console.WriteLine("An exception occured:\r\n " + request.Resource + "\r\n" + e + "\r\n"); 
    } catch (Exception ex) { 
     restResponse.ResponseStatus = ResponseStatus.Error; 
     restResponse.ErrorMessage = ex.Message; 
     restResponse.ErrorException = ex; 
    } 

    if (httpResponse != null) 
     httpResponse.Close(); 

    return restResponse; 
} 

यह इस लाइन पर विफल रहता है:

httpResponse = (HttpWebResponse)httpRequest.GetResponse(); 

स्टैक ट्रेस: ​​

System.Net.WebException: The remote server returned an error: (400) Bad Request. 
    at System.Net.HttpWebRequest.CheckFinalStatus (System.Net.WebAsyncResult result) [0x002f2] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1477 
    at System.Net.HttpWebRequest.SetResponseData (System.Net.WebConnectionData data) [0x00141] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1300 

अनुरोध कभी नहीं दूरस्थ सर्वर से हो रही है।

+0

** 400 ** सर्वर से आता है। यह सहायक होगा यदि आप एक स्निफर (उदाहरण के लिए वायरशर्क) चला सकते हैं और पता लगा सकते हैं कि उस मामले में क्या प्रसारित किया गया था (और उससे पहले की सामान्य प्रतिक्रिया से इसकी तुलना करें)। – poupou

+0

यह अजीब चीज है, यह सर्वर से नहीं आ रही है। आईआईएस कभी भी अनुरोध नहीं देखता है। –

+0

बहुत अजीब - लेकिन एक अच्छा सुराग! – poupou

उत्तर

2

समस्या clientHeaders संग्रह में था। यह RESTClient कक्षा आवेदक जीवन चक्र के दौरान एक बार तत्काल हो जाती है। मैं शीर्षकों को ऊपर और ऊपर जोड़ रहा था और उन्हें पहले साफ़ नहीं कर रहा था। थोड़ी देर बाद, हेडर बहुत बड़े हो गए और एक बुरा अनुरोध जारी किया गया।

+1

प्रदान किए गए कोड को देखकर इसे समझना आसान नहीं था :) –

0

मुझे लगता है कि आप कनेक्शन से बाहर हो जाते हैं। आप उन्हें बढ़ाने की कोशिश कर सकते हैं:

<configuration> <system.net> <connectionManagement> <add address="*" maxconnection="65535" /> </connectionManagement> </system.net> </configuration>

+0

आप कनेक्शन बढ़ाने के लिए वैसे भी कोशिश कर सकते हैं। – NickD

+0

मैं मोनो टच में ऐसा कैसे करूं? –

+0

System.Net.ServicePointManager.DefaultConnectionLimit = 65535; – NickD

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