example ejemplos ejemplo consumir consume c# dotnet-httpclient

c# - ejemplos - ¿Cómo obtener el cuerpo del contenido de una llamada httpclient?



httpclient c# post json (2)

La forma en que está utilizando wait / async es pobre en el mejor de los casos, y hace que sea difícil de seguir. Estás mezclando await con Task''1.Result , lo cual es confuso. Sin embargo, parece que está viendo un resultado final de la tarea, en lugar de los contenidos.

He reescrito su función y llamada de función, lo que debería solucionar su problema:

async Task<string> GetResponseString(string text) { var httpClient = new HttpClient(); var parameters = new Dictionary<string, string>(); parameters["text"] = text; var response = await httpClient.PostAsync(BaseUri, new FormUrlEncodedContent(parameters)); var contents = await response.Content.ReadAsStringAsync(); return contents; }

Y su última llamada a la función:

Task<string> result = GetResponseString(text); var finalResult = result.Result;

O mejor:

var finalResult = await GetResponseString(text);

He estado tratando de descubrir cómo leer el contenido de una llamada httpclient, y parece que no puedo entenderlo. El estado de respuesta que obtengo es 200, pero no puedo entender cómo llegar al Json real que se devuelve, ¡eso es todo lo que necesito!

El siguiente es mi código:

async Task<string> GetResponseString(string text) { var httpClient = new HttpClient(); var parameters = new Dictionary<string, string>(); parameters["text"] = text; Task<HttpResponseMessage> response = httpClient.PostAsync(BaseUri, new FormUrlEncodedContent(parameters)); return await response.Result.Content.ReadAsStringAsync(); }

Y lo obtengo simplemente llamándolo desde un método:

Task<string> result = GetResponseString(text);

Y esto es lo que obtengo

response Id = 89, Status = RanToCompletion, Method = "{null}", Result = "StatusCode: 200, ReasonPhrase: ''OK'', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:/r/n{/r/n Connection: keep-alive/r/n Date: Mon, 27 Oct 2014 21:56:43 GMT/r/n ETag: /"5a266b16b9dccea99d3e76bf8c1253e0/"/r/n Server: nginx/0.7.65/r/n Content-Length: 125/r/n Content-Type: application/json/r/n}" System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>

Actualización: este es mi código actual según la respuesta de Nathan a continuación

async Task<string> GetResponseString(string text) { var httpClient = new HttpClient(); var parameters = new Dictionary<string, string>(); parameters["text"] = text; var response = await httpClient.PostAsync(BaseUri, new FormUrlEncodedContent(parameters)); var contents = await response.Content.ReadAsStringAsync(); return contents; }

Y lo llamo desde este método ...

string AnalyzeSingle(string text) { try { Task<string> result = GetResponseString(text); var model = JsonConvert.DeserializeObject<SentimentJsonModel>(result.Result); if (Convert.ToInt16(model.pos) == 1) { _numRetries = 0; return "positive"; } if (Convert.ToInt16(model.neg) == 1) { _numRetries = 0; return "negative"; } if (Convert.ToInt16(model.mid) == 1) { _numRetries = 0; return "neutral"; } return ""; } catch (Exception e) { if (_numRetries > 3) { LogThis(string.Format("Exception caught [{0}] .... skipping", e.Message)); _numRetries = 0; return ""; } _numRetries++; return AnalyzeSingle(text); } }

Y sigue ejecutándose para siempre. Golpea la línea var model = JsonConvert.DeserializeObject<SentimentJsonModel>(result.Result); Una vez, y continúa sin detenerse en otro punto de interrupción.

Cuando detengo la ejecución, dice

Id = No se puede evaluar la expresión porque el código del método actual está optimizado., Estado = No se puede evaluar la expresión porque el código del método actual está optimizado., Método = No se puede evaluar la expresión porque el código del método actual está optimizado., Resultado = No se puede evaluar la expresión porque el código del método actual está optimizado.

.. Continúo la ejecución, pero solo se ejecuta para siempre. No estoy seguro de cual es el problema


Si no desea utilizar async , puede agregar .Result para forzar que el código se ejecute sincrónicamente:

private string GetResponseString(string text) { var httpClient = new HttpClient(); var parameters = new Dictionary<string, string>(); parameters["text"] = text; var response = httpClient.PostAsync(BaseUri, new FormUrlEncodedContent(parameters)).Result; var contents = response.Content.ReadAsStringAsync().Result; return contents; }