值未落在预期范围内.从Windows Phone 7调用gae托管的REST服务时出现错误

本文关键字:gae REST 服务 错误 调用 范围内 Phone Windows | 更新日期: 2023-09-27 17:50:18

我们在从Windows Phone 7模拟器中的应用程序向gae托管脚本发送http POST请求时遇到了麻烦。当回调方法HttpWebRequest.EndGetResponse()被调用时,它要么因超时而挂起,要么因异常"值不在预期范围内"而崩溃。流是异步的,我们尝试了基于HttpWebRequest的样本代码片段,来自MSDN, stackoverflow和其他来源,但他们没有帮助。

你能给我们一些关于这个主题的建议或提供一些示例代码,使POST请求与内容类型的应用程序/x-www-form-urlencoded(就像任何正常的web表单)?

请查看下面的代码示例:

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;
}

值未落在预期范围内.从Windows Phone 7调用gae托管的REST服务时出现错误

如果您的请求中有'&'或'='没有值,则可能是

例如http://smth.com?method=get&param=4&或http://smth.com?method=get&参数=

具有讽刺意味的是,将代码从WP7复制到Xamarin项目(WP 8.1)后仍然发生此问题。它也不能在Xamarin Android项目中工作,尽管有另一个例外。

经过两天的研究,我终于放弃了,并转移到WebClient类我的web请求,这工作就像一个魅力。