HTTPWebRequest & Nach einer Weile, 400 (Bad Request) startet

Habe ich ein background worker-thread, der ständig die Synchronisierung von Daten zu/von einem remote-server. Als ich zuerst die app starte, scheint alles gut zu funktionieren. Es macht den web-Anfrage, alle 30 Sekunden und die Daten erfolgreich zurückgegeben.

Wenn ich den simulator laufen für eine lange Zeit, schließlich schlägt die Anforderung fehl, mit einem (400) Bad Request. Und alle folgenden Anfragen das gleiche tun. Wenn ich kill die app und starten Sie es neu...alles ist gut.

Jemand irgendwelche Ideen? Code ist unten.

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

Scheitert es an dieser Zeile:

httpResponse = (HttpWebResponse)httpRequest.GetResponse();

Stack Trace:

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 

Die Anfrage nie bekommen, um die remote-server.

  • Die 400 vom server kommt. Es wäre hilfreich, wenn Sie laufen konnte einen sniffer (z.B. wireshark) und finden Sie heraus, was gesendet wurde, in diesem Fall (und vergleichen Sie es mit der normalen Antwort, die Sie bekam, bevor Sie das).
  • Das ist die seltsame Sache, es ist nicht die vom server kommt. IIS sieht nie die Anfrage kommen.
  • Sehr seltsam - aber eine schöne Ahnung!
  • Einen Grund, warum Sie Ihre Anfrage instanziiert wie der so ist? Ich würde lieber (HttpWebRequest)WebRequest.Create(new Uri(urlPath));. Haben Sie versucht, mit Ihrem code auf einem service, der keine Authentifizierung erforderlich ist? Haben Sie versucht, die Einstellung nicht die Post-Daten?
  • Gibt es einige lang laufende Anfragen (dauert eine lange Zeit für den server zu reagieren)? Wenn dieses Problem "auf", was passiert, wenn Sie starten Sie den remote-server anstelle von Ihnen eine eigene app? Sie haben die Möglichkeit, zu versuchen, dass? Der Grund warum ich Frage ist, dass ich denke, das OS wird verhindert, dass zu viele gleichzeitige ausgehende Anfrage auf das gleiche Ziel...
  • Nur eine Vermutung, aber es könnte eine regression in HttpWebRequest, die führt zu das gleiche Verhalten wie beschrieben in diesen bug: bugzilla.novell.com/show_bug.cgi?id=648862 Also, nur um der es versuchen httpRequest.KeepAlive = false; und sehen, ob das hilft. Ansonsten würde ich empfehlen, einen neuen bug-report in xamarins bugzilla und bieten ein Testfall reproduziert werden kann, an Ihrem Ende. Ein anderes weit hergeholt Vorschlag könnte sein, zu versuchen, machen Sie code async, aber ich sehe nicht ein, warum, der sollte sich anders Verhalten.
  • Haben Sie das Escapezeichen für Zeichen / (%2f) in einen URI (request.Ressource)? Oder erscheint es nach Zeit? Es ist ein problem mit dem Uri-Konstruktor: stackoverflow.com/questions/10413795/...

InformationsquelleAutor Chris Kooken | 2012-06-08
Schreibe einen Kommentar