2014-11-22 21 views
4

HTTP響應代碼我很新的C#,更不用說Windows Phone的開發:)處理在GetStringAsync

我試圖發送一個請求,得到JSON響應,但是如果有錯誤(例如作爲401),能夠告訴用戶這樣的。這裏是我的代碼:

async Task<string> AccessTheWebAsync() 
     { 
      //builds the credentials for the web request 
      var credentials = new NetworkCredential(globalvars.username, globalvars.password); 
      var handler = new HttpClientHandler { Credentials = credentials }; 

      //calls the web request, stores and returns JSON content 
      HttpClient client = new HttpClient(handler); 
      Task<string> getStringTask = client.GetStringAsync("https://www.bla.com/content"); 

      String urlContents = await getStringTask; 

      return urlContents; 

     } 

我知道它一定是我做錯了,我發送請求和存儲響應的方式......但我只是不知道是什麼。

如果有錯誤,我得到一個一般: net_http_message_not_success_statuscode

謝謝!

+0

如果你想有一個更好的控制使用HttpWebRequest來代替。有了它,你可以獲得關於錯誤的所有信息,甚至可以讀取錯誤的respose主體。 – Gusman 2014-11-22 17:49:16

+0

對不起,你能否給我舉個例子說明我可以如何使用它,而不是我上面所說的? – Brendon 2014-11-22 18:59:27

回答

0

而不是使用的HttpClient使用普通的好老的HttpWebRequest :)

async Task<string> AccessTheWebAsync() 
    { 

     HttpWebRequest req = WebRequest.CreateHttp("http://example.com/nodocument.html"); 
     req.Method = "GET"; 
     req.Timeout = 10000; 
     req.KeepAlive = true; 

     string content = null; 
     HttpStatusCode code = HttpStatusCode.OK; 

     try 
     { 
      using (HttpWebResponse response = (HttpWebResponse)await req.GetResponseAsync()) 
      { 
       using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
        content = await sr.ReadToEndAsync(); 

       code = response.StatusCode; 
      } 
     } 
     catch (WebException ex) 
     { 

      using (HttpWebResponse response = (HttpWebResponse)ex.Response) 
      { 
       using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
        content = sr.ReadToEnd(); 

       code = response.StatusCode; 
      } 

     } 

     //Here you have now content and code. 

     return content; 

    } 
+0

我的確嘗試過,但我現在碰到的問題是GetResponse()在WinPhone上沒有出現...有getResponseAsync(),但仍然試圖弄清楚如何使用它.. – Brendon 2014-11-22 19:28:37

+0

好吧,讓我五秒 – Gusman 2014-11-22 19:29:05

+0

完成,更新爲異步 – Gusman 2014-11-22 19:34:41

11

你可以使用TE GetAsync()方法,而不是GetStringAsync()的。

HttpResponseMessage response = await client.GetAsync("https://www.bla.com/content"); 

if(!response.IsSuccessStatusCode) 
{ 
    if (response.StatusCode == HttpStatusCode.Unauthorized) 
    { 
     do something... 
    } 
} 
String urlContents = await response.Content.ReadAsStringAsync(); 

這樣你就可以利用HttpStatusCode枚舉來檢查返回的狀態碼。

+0

如果要在同一行代碼中同步等待帶有「.Result」的結果,調用'GetAsync'有什麼作用? ?提交了一個編輯。 – Dan 2017-01-03 20:05:42