У нас возникают проблемы при отправке HTTP-запроса POST в скрипт GAE из приложения в эмуляторе Windows Phone 7.Когда вызывается метод обратного вызова HttpWebRequest.EndGetResponse () , он либо зависает с таймаутом, либо вылетает с исключением «Значение не попадает в ожидаемый диапазон».Поток асинхронный, мы попробовали пример кода на основе HttpWebRequest из MSDN, stackoverflow и других источников, но они не помогают.
Не могли бы вы дать нам несколько советов по этой теме или предоставить пример кода для выполнения запросов POST с помощью типа контента application / x-www-form-urlencoded (как и любая обычная веб-форма)?
Ниже приведен пример кода:
public void CallRestService() {
var request = WebRequest.Create("https://blogboosterapi.appspot.com/") as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.BeginGetRequestStream(ar => {
var request1 = (HttpWebRequest) ar.AsyncState;
using (var postStream = request1.EndGetRequestStream(ar)) {
var formData = Encoding.UTF8.GetBytes(ParametersToString(GetParameters()));
postStream.Write(formData, 0, formData.Length);
postStream.Close();
}
request1.BeginGetResponse(a => {
var request2 = (HttpWebRequest) a.AsyncState;
WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);
var response = (HttpWebResponse) request2.EndGetResponse(a);
// It fails here ^^^^^^^^^^^^^^^^^^^^^^^^^^
using (var streamResponse = response.GetResponseStream()) {
using (var streamReader = new StreamReader(streamResponse)) {
var responseString = streamReader.ReadToEnd();
//
}
}
}, request1);
}, request);
}
private static string ParametersToString(Dictionary<string, string> parameters) {
var stringBuilder = new StringBuilder();
foreach (var parameter in parameters) {
stringBuilder.AppendFormat("{0}={1}&", parameter.Key, parameter.Value);
}
return stringBuilder.ToString();
}
public Dictionary<string, string> GetParameters() {
var parameters = new Dictionary<string, string>();
//Mandatory parameters
parameters["methodName"] = "initUser";
parameters["timestamp"] = DateTime.UtcNow.ToString("o");
parameters["language"] = "en";
parameters["clientId"] = string.Empty;
parameters["apiVersion"] = "1";
//Method parameters
parameters["clientType"] = "4";
parameters["clientUDID"] = "1234567890";
parameters["clientOS"] = "Windows Phone 7";
//Optional parameters
parameters["clientFirmware"] = "1.0";
parameters["country"] = "ru";
parameters["phoneNumber"] = "+791012345678";
return parameters;
}