postasync postasjsonasync c# asp.net-mvc-4 asp.net-web-api

c# - postasync - Obtener respuesta de PostAsJsonAsync



postasjsonasync c# (5)

Tengo esta linea de codigo

var response = new HttpClient().PostAsJsonAsync(posturi, model).Result;

El controlador llamado WebAPI devuelve un bool para asegurarse de que se guardó el objeto, pero ¿cómo devuelvo esa respuesta de bool?


Continuar obteniendo de contenido:

var httpClient = new HttpClient(); var response = httpClient.PostAsJsonAsync(posturi, model).Result; bool returnValue = response.Content.ReadAsAsync<bool>().Result;

Pero, este es un enfoque realmente ingenuo para obtener resultados rápidamente. PostAsJsonAsync y ReadAsAsync no están diseñados para hacer esto, están diseñados para admitir la programación async await , por lo que su código debe ser:

var httpClient = new HttpClient(); var response = await httpClient.PostAsJsonAsync(posturi, model); bool returnValue = await response.Content.ReadAsAsync<bool>();

Además, en lugar de utilizar un indicador para verificar si un objeto está guardado o no, debe utilizar los códigos HTTP devolviendo 200 OK para determinar que el ahorro se realizó correctamente.


La respuesta aceptada es técnicamente correcta pero bloquea el hilo actual en las llamadas a .Result . Si está utilizando .NET 4.5 o superior, debe evitarlo en casi todas las situaciones. En su lugar, use la versión asíncrona equivalente (sin bloqueo):

var httpClient = new HttpClient(); var response = await httpClient.PostAsJsonAsync(posturi, model); bool returnValue = await response.Content.ReadAsAsync<bool>();

Tenga en cuenta que el método que contiene el código anterior debe marcarse como async , y debe estar en await .


Si llama a la versión genérica, debería devolverle el bool:

var response = new HttpClient().PostAsJsonAsync<bool>(posturi, model).Result;

Al menos según los documentos .


Usé HttpStatusCode para verificar el resultado.

public HttpStatusCode PostStaffPositions(Foo foo) { string uri = myapiuri; using (HttpClient httpClient = new HttpClient()) { var response = httpClient.PostAsJsonAsync(uri, foo).Result; return response.StatusCode; } }

Y luego en Controlador, compruébalo así:

HttpStatusCode update = staffrest.PostStaffPositions(foo); if (update == HttpStatusCode.OK) { //Update Succeed } else { //Update Failed }


Ya que es una operación Async, no hagas inmediatamente .Resultar como está mal

En su lugar, debes hacerlo asíncrono haciendo esto:

var httpClient = new HttpClient ()

var task = httpClient.PostAsJsonAsync(posturi, model) .ContinueWith( x => x.Result.Content.ReadAsAsync<bool>().Result); // 1. GETTING RESPONSE - NOT ASYNC WAY task.Wait(); //THIS WILL HOLD THE THREAD AND IT WON''T BE ASYNC ANYMORE! bool response = task.Result // 2. GETTING RESPONSE - TASK ASYNC WAY (usually used in < .NET 4.5 task.ContinueWith( x => { bool response = x.Result }); // 3. GETTING RESPONSE - TASK ASYNC WAY (usually used in >= .NET 4.5 bool response = await task;

NOTA: los escribí aquí, así que en realidad no los probé, pero más o menos eso es lo que quieres.

¡Espero que ayude!