如何克服(HttpWebResponse)HttpReq.GetResponse()中的错误?

时间:2014-04-04 06:55:02

标签: c# json windows-phone-8

我在Visual Studio 2012移动版中使用它时在GetResponse()方法中遇到错误,但它在Visual Studio桌面版中​​工作正常,请帮助,

  

守则如图所示

  var myurl = "https://api.forecast.io/forecast/4b1ac2aa66db99adcf90578132b507d4/";


        string url = myurl + lat + "," + lon; 

        var request = HttpWebRequest.Create(url);
        request.ContentType = "application/json";
        request.Method = "GET";
        using (HttpWebResponse response = request.GetResponse () as HttpWebResponse) {            
            if (response.StatusCode != HttpStatusCode.OK) {
                //Console.Out.WriteLine("Error fetching data. Server returned status code: {0}", response.StatusCode);
            }
            using (StreamReader reader = new StreamReader (response.GetResponseStream ())) {
                string content = reader.ReadToEnd ();
                Console.WriteLine (reader.ReadToEnd ());
                if (string.IsNullOrWhiteSpace (content)) {
                    //Console.Out.WriteLine("Response contained empty body...");
                } else {   
                    myopt = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject> (content);


                    System.DateTime dtDateTime = new DateTime (1970, 1, 1, 0, 0, 0, 0);
                    double unixTimeStamp = 1392316200;
                    dtDateTime = dtDateTime.AddSeconds (myopt.hourly.data [23].time).ToLocalTime ();

myopt是各种Json类的rootobject类的对象。 请帮助我,因为我对这个领域很陌生,谢谢

1 个答案:

答案 0 :(得分:0)

在Windows Phone中,所有Http请求都是异步完成的。因此,您无法呼叫GetReponse(),因为它正在阻止。相反,您应该使用异步调用BeginGetResponse并向其传递一个回调函数,该函数将在收到响应时被调用。

以下是您如何异步执行简单的HttpWebRequest:

string myUrl = "http://example.com"

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(myUrl);
request.BeginGetResponse(myCallback, request);

然后像这样定义回调:

void myCallback(IAsyncResult result)
{
    HttpWebRequest request = result.AsyncState as HttpWebRequest;
    if (request != null)
    {
        try
        {
            HttpWebResponse response = request.EndGetResponse(result);
            //You can check the response code this way
            if (reponse.StatusCode == HttpStatusCode.OK) {
                //Do stuff with your response
            }
        }
        catch (WebException e)
        {
            //Handle exception
        }
    }
}

由于这是一个异步调用,因此在一个新线程中调用回调方法,该新线程与您创建请求的线程不同。因此,请务必考虑到这一点,以避免无效的跨线程访问。

有关详细信息,请参阅to here