Я пытаюсь разработать приложение для 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);
}
Любые предложенияо том, что здесь не так?
Спасибо за любые ваши предложения.