2015-05-11 13 views

risposta

9

Non ho ancora testato per garantire la sua prestazione, tuttavia questo sembra promettente:

using(HttpClient client = new HttpClient()) 
{ 
    var response = await client.GetAsync("http://httpbin.org/get", HttpCompletionOption.ResponseHeadersRead); 

    response.EnsureSuccessStatusCode(); 

    using (var stream = await response.Content.ReadAsStreamAsync()) 
    using (var streamReader = new StreamReader(stream)) 
    using (var jsonReader = new JsonTextReader(streamReader)) 
    { 
     var serializer = new JsonSerializer(); 

     //do some deserializing http://www.newtonsoft.com/json/help/html/Performance.htm 
    } 
} 
+0

usando 'HttpCompletionOption' è sicuramente il modo previsto per ottenere ciò che cercavi. –

2

preferisco di disporre del HttpResponseMessage via using come è usa e getta. Preferisco anche non fare affidamento sulla gestione delle eccezioni per gestire le richieste non riuscite. Preferisco invece controllare il valore booleano IsSuccessStatusCode e procedere di conseguenza. Per esempio:

using(HttpClient client = new HttpClient()) 
{ 
    using(var response = await client.GetAsync("http://httpbin.org/get", HttpCompletionOption.ResponseHeadersRead)) 
    { 
     if(response.IsSuccessStatusCode) 
     { 
      using (var stream = await response.Content.ReadAsStreamAsync()) 
      using (var streamReader = new StreamReader(stream)) 
      using (var jsonReader = new JsonTextReader(streamReader)) 
      { 
       var serializer = new JsonSerializer(); 

       //do some deserializing http://www.newtonsoft.com/json/help/html/Performance.htm 
      } 
     } 
     else { 
      //do your error logging and/or retry logic 
     } 
    }  
} 

EDIT: Se stai facendo il lavoro con un tasso di limitato API di inviare la richiesta testa appena a volte non è fattibile. Come tale, ecco un esempio di codice utilizzando la moda buoni vecchi HttpWebRequest (notare che non ci sia un modo migliore per trattare con errori HTTP di WebException in questo caso):

var req = WebRequest.CreateHttp("http://httpbin.org/get"); 

/* 
* execute 
*/ 
try 
{ 
    using (var resp = await req.GetResponseAsync()) 
    { 
     using (var s = resp.GetResponseStream()) 
     using (var sr = new StreamReader(s)) 
     using (var j = new JsonTextReader(sr)) 
     { 
      var serializer = new JsonSerializer(); 
      //do some deserializing http://www.newtonsoft.com/json/help/html/Performance.htm 
     } 
    } 
} 
catch (WebException ex) 
{ 
    using (HttpWebResponse response = (HttpWebResponse)ex.Response) 
    { 
     using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
     { 
      string respStr = sr.ReadToEnd(); 
      int statusCode = (int)response.StatusCode; 

      //do your status code logic here 
     } 
    } 
}