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/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
War das problem in der
clientHeaders
Sammlung. DieseRESTClient
Klasse instanziiert wird, sobald während der Anwendung Lebenszyklus. Ich war das hinzufügen von Header über und über und nicht-clearing Sie aus Erster. Nach einer Weile, den Header zu groß und eine schlechte Anforderung ausgestellt wurde.Ich annehmen, dass Sie verbindungen zur Verfügung. Sie können versuchen, Sie zu erhöhen:
<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="65535" />
</connectionManagement>
</system.net>
</configuration>