serialize serializar newtonsoft net jsonconvert example deserializar c# stream json.net httpclient

serializar - serialize json to object c#



HttpClient GetStreamAsync y códigos de estado http? (2)

Deseo utilizar transmisiones según lo recomendado por la documentación de consejos de rendimiento de json.net , sin embargo, no puedo encontrar la forma de obtener los códigos de estado de http sin la típica espera de HttpResponse .

¿Hay quizás una forma de obtener el código de estado primero sin leer los datos? Entonces, ¿aún aprovechas las transmisiones?


No he probado para asegurar su rendimiento, sin embargo, esto parece prometedor:

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 } }


Prefiero deshacerme del HttpResponseMessage using como es desechable. También prefiero no confiar en el manejo de excepciones para tratar las solicitudes fallidas. En su lugar, prefiero verificar el valor booleano IsSuccessStatusCode y proceder en consecuencia. Por ejemplo:

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 } } }

EDITAR: Si está trabajando con una API de velocidad limitada que envía la solicitud HEAD, a veces no es posible. Como tal, aquí hay una muestra de código que utiliza la buena moda HttpWebRequest (tenga en cuenta que no hay una mejor manera de lidiar con los errores http que WebException en este 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 } } }