2011-04-17 20 views
1

从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; 
} 
+0

我绝望时,当我看到表达lambdas使用方法会更清晰。 – 2011-04-17 07:07:35

+0

什么是完整的异常堆栈跟踪?它是C#代码中的异常,还是响应中返回的文本? – 2011-04-18 01:55:01

回答

0

它可能是,如果您在请求中有“&”或“=”没有价值例如http://smth.com?method=get&param=4&http://smth.com?method=get&param=

+0

我会在我们的情况PhoneNumber,我相信 – Polhovskiy 2011-04-17 08:49:55

+0

感谢您的答复,但它仍然没有帮助,即使我填充所有参数的值。 我也调整了服务没有任何参数,它仍然没有通过。我甚至无法在提琴手中看到服务电话。 对我来说,它看起来像模拟器无法进行服务调用。 – 2011-04-24 04:00:24

+0

@AntBevzyuk我试过相同的代码。但我得到错误'{System.Net.WebException:远程服务器返回一个错误:NotFound。在System.Net.Browser.AsyncHelper 在System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult的asyncResult) 在System.Net.Browser.ClientHttpWebRequest。<> c__DisplayClasse。 b__d(对象sendState) 。<> c__DisplayClass1 。 b__0(Object sendState)}'。如果我的字节数组长度很大,那么它会给出错误。看到我的问题http://stackoverflow.com/questions/22139767/windows-phone-upload-files-to-goolge-drive – 2014-03-03 07:00:11

0

具有讽刺意味的是,将代码从WP7复制到Xamarin项目(WP 8.1)后仍然出现此问题。它也不适用于Xamarin Android项目,但有另一个例外。

经过两天的研究,我终于放弃了,并搬到WebClient班,以获取我的网络请求,这很像一个魅力。

相关问题