(C #) Асинхронный HTTPWebRequest Не удалось связаться с сервером - PullRequest
0 голосов
/ 09 декабря 2010

Я пытаюсь разработать приложение для Windows Phone 7.Часть этого приложения включает в себя обращение к API для получения некоторых данных.Для этого я использую HTTPWebRequest и небольшой вспомогательный класс, который я написал;Я вызываю HTTPHelper sendAPIRequest и затем извлекаю результат.

Проблема заключается в цепочке выполнения после инициирования асинхронного запроса.В ходе отладки я обнаружил, что callCallBack обратного вызова BeginGetRequestStream вызывается.Этот обратный вызов впоследствии вызывает BeginGetResponse и его обратный вызов;к сожалению, его обратный вызов (responseCallBack) никогда не запускается.Я определил, что с сервером, на котором работает API, никогда не связываются (в логах Apache ничего нет), и после выполнения request.BeginGetResponse отладчик показывает пустой список локальных объектов и пустой стек;обратный вызов никогда не срабатывает, и программа не идет никуда.Я перепробовал все виды отладки, о которых только могу подумать, но на этом я заканчиваю.Никаких исключений не выдается, ничего не выглядит - программа просто не может связаться с сервером и продолжить.

Вот код, который я использую: public class HTTPHelper { public string postString { get; set; } public string responseData { get; set; }</p> <pre><code> private static ManualResetEvent readyToGo = new ManualResetEvent(false); public void sendAPIRequest(string mode, string data) { GenericAPIRequest requestInformation = new GenericAPIRequest { data = data, device_id = getDeviceId(), method = mode }; HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.1.69/api/master.php?source=client"); request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; string postData = "device_id=" + getDeviceId() + "&data=" + JsonConvert.SerializeObject(requestInformation) + "&mode=" + mode; postString = postData; request.BeginGetRequestStream(new AsyncCallback(requestCallBack), request); // Stop the thread until we've finished our HTTP request readyToGo.WaitOne(); return; } private void requestCallBack(IAsyncResult asynchronousResult) { HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; Stream postStream = request.EndGetRequestStream(asynchronousResult); byte[] postBytes = Encoding.UTF8.GetBytes(postString); postStream.Write(postBytes, 0, postString.Length); postStream.Close(); request.BeginGetResponse(new AsyncCallback(responseCallBack), request); return; } private void responseCallBack(IAsyncResult asynchronousResult) { HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult); Stream streamResponse = response.GetResponseStream(); StreamReader streamRead = new StreamReader(streamResponse); responseData = streamRead.ReadToEnd(); streamResponse.Close(); streamRead.Close(); response.Close(); // Release the thread... readyToGo.Set(); return; } private string getDeviceId() { // Gets the unique device ID, allows us to track the device. byte[] result = null; object uniqueId; if (DeviceExtendedProperties.TryGetValue("DeviceUniqueId", out uniqueId)) result = (byte[])uniqueId; return System.BitConverter.ToString(result); }

Любые предложенияо том, что здесь не так?

Спасибо за любые ваши предложения.

1 Ответ

2 голосов
/ 09 декабря 2010

Попробуйте вытащить readyToGo.WaitOne (). Это приведет к остановке потока и ожиданию сигнала. Вероятно, запрос должен обрабатываться в этом потоке и поэтому не вызывается.

Как ни странно, у меня была очень похожая проблема с событиями сброса всего несколько минут назад, хотя это было с WPF вместо HttpRequests:).

Кстати, у меня есть справочная библиотека кода на CodePlex, которая включает в себя помощника HttpWebRequest (он, вероятно, не поможет вам напрямую, просто подумал, что упомяну это) Вы можете использовать его в любом случае (даже если вам нужны части кода, которые вам нравятся). Проект называется BizArk , а класс называется WebHelper.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...