值未落在预期范围内.从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;
}
如果您的请求中有'&'或'='没有值,则可能是
例如http://smth.com?method=get¶m=4&或http://smth.com?method=get&参数=
具有讽刺意味的是,将代码从WP7复制到Xamarin项目(WP 8.1)后仍然发生此问题。它也不能在Xamarin Android项目中工作,尽管有另一个例外。
经过两天的研究,我终于放弃了,并转移到WebClient
类我的web请求,这工作就像一个魅力。