У меня есть фоновый рабочий поток, который постоянно синхронизирует данные с / с удаленного сервера. Когда я впервые запускаю приложение, все работает нормально. Он делает веб-запрос каждые 30 секунд, и данные успешно возвращаются.
Если я оставлю симулятор включенным на долгое время, в конечном итоге запрос завершится ошибкой с ошибкой (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
Запрос никогда не попадает на удаленный сервер.
(HttpWebRequest)WebRequest.Create(new Uri(urlPath));
. Вы пробовали использовать свой код в службе, не требующей аутентификации? Вы пробовали не устанавливать данные публикации? - person Cheesebaron   schedule 12.06.2012httpRequest.KeepAlive = false;
и посмотрите, поможет ли это. В противном случае я бы рекомендовал создать новый отчет об ошибке в xamarins bugzilla и предоставить тестовый пример, который можно воспроизвести на их стороне. Еще одно надуманное предложение - попробовать сделать код асинхронным, но я не понимаю, почему это должно вести себя по-другому. - person Cheesebaron   schedule 26.06.2012