consumir consume c# asp.net-web-api dotnet-httpclient

consume - httpclient c# post



Llamar al servicio HTTP externo utilizando HttpClient desde una acción de la API web (2)

Ajá, necesitaba hacer lo siguiente (devolver una tarea en lugar de anularla):

// GET api/values public async Task<IEnumerable<string>> Get() { var result = await GetExternalResponse(); return new string[] { result, "value2" }; } private async Task<string> GetExternalResponse() { var client = new HttpClient(); HttpResponseMessage response = await client.GetAsync(_address); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync(); return result; }

Además, no me había dado cuenta de que podía marcar la operación Get () como asíncrona, que es lo que me permitió esperar la llamada externa.

Gracias a Stephen Cleary por su publicación en el blog Async y Await, que me indicaron la dirección correcta.

Estoy llamando a un servicio externo utilizando HttpClient desde un proyecto de ASP.Net MVC 4 Web Api que se ejecuta en .Net Framework 4.5

El código de ejemplo es el siguiente (ignore los valores de retorno, ya que este es un código de ejemplo para probar cómo llamar a un servicio externo):

public class ValuesController : ApiController { static string _address = "http://api.worldbank.org/countries?format=json"; private string result; // GET api/values public IEnumerable<string> Get() { GetResponse(); return new string[] { result, "value2" }; } private async void GetResponse() { var client = new HttpClient(); HttpResponseMessage response = await client.GetAsync(_address); response.EnsureSuccessStatusCode(); result = await response.Content.ReadAsStringAsync(); } }

Si bien el código en el método privado sí funciona, el problema que tengo es que el Controlador Get () llama a GetResponse () pero no está esperando el resultado, sino que ejecuta el retorno con resultado = nulo.

También he intentado usar una llamada sincrónica más simple con un WebClient de la siguiente manera:

// GET api/values public IEnumerable<string> Get() { //GetResponse(); var client = new WebClient(); result = client.DownloadString(_address); return new string[] { result, "value2" }; }

que funciona bien.

¿Qué estoy haciendo mal? ¿Por qué Get () no espera la finalización del método privado en la muestra asíncrona?


Con el nombre de usuario y contraseña llame a Httpclient. En caso de API se requiere autenticación.

public async Task<ActionResult> Index() { const string uri = "https://testdoamin.zendesk.com/api/v2/users.json?role[]=agent"; using (var client1 = new HttpClient()) { var header = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("[email protected]:123456")));///username:password for auth client1.DefaultRequestHeaders.Authorization = header; var aa = JsonConvert.DeserializeObject<dynamic>(await client1.GetStringAsync(uri)); } }