2012-06-08 8 views
6

バックグラウンドワーカースレッドは、リモートサーバーとの間でデータを常に同期しています。私が最初にアプリケーションを実行すると、すべて正常に動作するように見えます。これは約30秒ごとにWeb要求を行い、データは正常に返されます。HTTPWebRequest&400(Bad Request)が開始されました

シミュレータを長時間実行したままにすると、最終的に要求が失敗し、(400)Bad Requestが発生します。その後のすべての要求は同じことを行います。私は、アプリを殺すし、それを再起動する...すべてがうまくいきます。

誰もが考えている?コードは以下のとおりです。

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 **はサーバーからのものです。スニッファ(例:wireshark)を実行して、その場合に送信された内容を知ることができれば、それを以前の正常な応答と比較すると役に立ちます。 – poupou

+0

それはサーバーから来ていない奇妙なことです。 IISは要求が来ることを決して見ません。 –

+0

非常に奇妙な - しかし、素晴らしい手がかり! – poupou

答えて

2

問題がclientHeadersコレクションにありました。このRESTClientクラスは、アプリケーションライフサイクル中に1回インスタンス化されます。私はヘッダーを何度も追加していて、最初にそれらをクリアしませんでした。しばらくすると、ヘッダーが大きくなりすぎて、不正なリクエストが発行されました。

+1

提供されたコードを見ることでこれを理解することは容易ではありません:) –

0

接続が不足していると思われます。あなたはそれらを増加しようとすることができます:

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

+0

あなたは接続を増やすためにとにかく試すことができます。 – NickD

+0

MonoTouchでどうすればいいですか? –

+0

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

関連する問題