从Windows Phone 7仿真器中的应用程序向GAE托管的脚本发送http POST请求时遇到问题。当回调方法HttpWebRequest.EndGetResponse()被调用时,它会挂起超时或崩溃,异常“值不在预期范围内”。流程是异步的,我们尝试了基于HttpWebRequest的示例代码片段,来自MSDN,stackoverflow和其他来源,但它们并没有帮助。“价值不在预期范围内”。从Windows Phone 7呼叫GAE托管的REST服务时发生错误
您可以给我们一些关于这个主题的建议,或者提供一些示例代码,用于使用内容类型应用程序/ x-www-form-urlencoded(就像任何普通的web表单)发出POST请求。
请看以下代码示例:
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"] = "+791";
return parameters;
}
我绝望时,当我看到表达lambdas使用方法会更清晰。 – 2011-04-17 07:07:35
什么是完整的异常堆栈跟踪?它是C#代码中的异常,还是响应中返回的文本? – 2011-04-18 01:55:01