«Значение не попадает в ожидаемый диапазон». ошибка при вызове службы REST, размещенной в GAE, из Windows Phone 7 - PullRequest
1 голос
/ 17 апреля 2011

У нас возникают проблемы при отправке 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;
}

Ответы [ 2 ]

0 голосов
/ 21 марта 2016

Как ни странно, эта проблема все еще возникала после копирования кода из WP7 в проект Xamarin (WP 8.1). Он также не работает в проекте Xamarin Android, хотя с другим исключением.

После двух дней исследований я наконец сдался и перешел в класс WebClient для моих веб-запросов, который работает как чудо.

0 голосов
/ 17 апреля 2011

это может быть, если у вас есть '&' или '=' без значений в вашем запросе, например, http://smth.com? Method = get¶m = 4 & или http://smth.com? Method = get¶m =

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