Red de conocimiento informático - Material del sitio web - Cómo llamar a Web API a través de HttpClient en una aplicación WPF

Cómo llamar a Web API a través de HttpClient en una aplicación WPF

Llamadas asincrónicas

Llamadas asincrónicas

HttpClient está diseñado para no bloquear operaciones potencialmente de larga duración que se implementan como métodos asincrónicos, como GetAsync y PostAsync. Estos métodos regresan sin esperar a que se complete la operación. El tutorial anterior (Llamar a una API web desde una aplicación de consola) mostró solo llamadas de bloqueo:

HttpClient está diseñado para no bloquear. Potencialmente, las operaciones de larga duración se implementan como métodos asincrónicos, por ejemplo, GetAsync y PostAsync. Estos métodos no esperan a que se complete la operación antes de regresar. El tutorial anterior (Llamar a una API web desde una aplicación de consola) solo mostró llamadas de bloqueo:

HttpResponseMessage respuesta = client.GetAsync("api/products").Result // ¡Llamada de bloqueo!

Este código bloquea el hilo de llamada tomando la propiedad Result. Eso está bien para una aplicación de consola, pero no debe hacerlo desde un hilo de UI, porque bloquea la respuesta de la UI a la entrada del usuario.

p>

Este código bloqueará el hilo de llamada utilizando el atributo Resultado. Para una aplicación de consola, esto está bien, pero no debe hacerlo en un hilo de la interfaz de usuario porque evita que la interfaz de usuario responda a la entrada del usuario.

Los métodos asincrónicos de HttpClient devuelven objetos Task que representan la operación asincrónica.

Los métodos asincrónicos de HttpClient devuelven objetos Task que representan la operación asincrónica.

Crear el proyecto WPF

Crear un proyecto WPF

Inicie Visual Studio En el menú Inicio, seleccione Nuevo proyecto. En el panel Plantillas, seleccione Plantillas instaladas. y expanda el nodo de Visual C#. En la lista de plantillas de proyecto, seleccione Aplicación WPF y haga clic en Aceptar.

Inicie Visual Studio. Seleccione Nuevo proyecto en el menú Inicio. En el panel Plantillas, seleccione Plantillas instaladas y expanda el nodo Viusal C#. En la lista de plantillas de proyecto, seleccione "Aplicación WPF". Asigne un nombre a este proyecto y haga clic en Aceptar.

Abra MainWindow.xaml y agregue el siguiente marcado XAML dentro del control Grid:

Abra MainWindow.xaml y agregue el siguiente marcado XAML dentro del control Grid:

>p>

Precio: $

()

Este marcado define un ListBox que estará vinculado a los datos de la lista de productos. El DataTemplate define cómo será cada producto. se mostrará.

Esta etiqueta define un ListBox que estará vinculado a los datos de la lista de productos. DataTemplate define cómo se muestra cada producto. (El efecto se muestra en la Figura 3-4).

Figura 3-4. Efecto de interfaz WPF

Agregar la clase de modelo

Agregar la clase de modelo

Agregar la siguiente clase al aplicación:

Agregue la siguiente clase a su aplicación:

clase Producto

{

cadena pública Nombre { get;

Precio doble público { get; set }

Categoría de cadena pública { get; un objeto de datos que HttpClient escribirá en el cuerpo de la solicitud HTTP y leerá en el cuerpo de la respuesta HTTP.

Esta clase define un objeto de datos que HttpClient escribirá en el cuerpo de la solicitud HTTP y leerá en el cuerpo de la respuesta HTTP. Léelo.

También agregaremos una clase observable para el enlace de datos:

También agregaremos una clase observable para el enlace de datos:

clase ProductsCollection: ObservableCollection< Producto>

{

public void CopyFrom(IEnumerable productos)

{

este .Items.Clear();

foreach (var p en productos)

{

this.Items.Add(p);

}

this.OnCollectionChanged(

new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));

}

}

Instalar el Administrador de paquetes NuGet

Instalar el Administrador de paquetes NuGet

El Administrador de paquetes NuGet es la forma más sencilla de agregar la biblioteca del cliente API web a un proyecto. Si aún no tiene instalado el Administrador de paquetes NuGet, instálelo como. siguiente.

La forma más sencilla de agregar la biblioteca cliente Web API a su proyecto es instalar el "Administrador de paquetes NuGet". Si el administrador de paquetes NuGet no está instalado, siga los pasos a continuación para instalarlo.

1.Inicie Visual Studio.

Inicie Visual Studio.

2.En el menú Herramientas, seleccione Extensiones y actualizaciones.

En el menú Herramientas, seleccione Extensiones y actualizaciones

3. En el cuadro de diálogo Extensiones y actualizaciones, seleccione En línea.

En el cuadro de diálogo Extensiones y actualizaciones, seleccione En línea ”

4.Si no ve "Administrador de paquetes NuGet", escriba "administrador de paquetes Nuget" en el cuadro de búsqueda.

Si no ve "Administrador de paquetes NuGet", ingrese "paquete nuget administrador" en el cuadro de búsqueda.

5.Seleccione el Administrador de paquetes NuGet y haga clic en Descargar.

Seleccione el "Administrador de paquetes NuGet" y haga clic en "Descargar".

6.Después de que se complete la descarga, se le pedirá que realice la instalación.

Después de que se complete la descarga, se le pedirá que realice la instalación.

7.Una vez completada la instalación, es posible que se le solicite que reinicie Visual Studio.

Una vez completada la instalación, es posible que se le solicite que reinicie Visual Studio.

El proceso de instalación anterior se muestra en la Figura 3-5.

Figura 3-5. Instalar el Administrador de paquetes NuGet

Instalar las bibliotecas cliente de API web

Instalar las bibliotecas cliente de API web

Después de instalar NuGet Package Manager, agregue el paquete de bibliotecas de cliente Web API a su proyecto.

Después de instalar NuGet Package Manager, agregue el paquete de bibliotecas de cliente Web API a su proyecto. Los pasos son los siguientes:

1. En el menú Herramientas, seleccione Administrador de paquetes de biblioteca. Nota: Si no ve este elemento del menú, asegúrese de que el Administrador de paquetes NuGet esté instalado correctamente.

Desde Seleccione "Administrador de paquetes de biblioteca" en el menú "Herramientas". Nota: Si no ve este elemento de menú, asegúrese de tener instalado correctamente el administrador de paquetes NuGet.

2.Seleccione Administrar paquetes NuGet para la solución...

Seleccione "Administrar paquetes NuGet para la solución..."

3.En Administrar paquetes NuGet cuadro de diálogo, seleccione En línea.

En el cuadro de diálogo "Administrar paquetes NuGet", seleccione "En línea".

4.En el cuadro de búsqueda, escriba "Microsoft.AspNet.WebApi.Client".

Ingrese "Microsoft.AspNet.WebApi.Client" en el cuadro de búsqueda.

5.Seleccione el paquete ASP.NET Web API Self Host y haga clic en Instalar.

Seleccione el "paquete ASP.NET Web API Self Host" y haga clic en "Instalar".

6.Después de instalar el paquete, haga clic en Cerrar para cerrar el cuadro de diálogo.

Después de instalar el paquete, haga clic en "Cerrar" para cerrar el cuadro de diálogo.

Los pasos de instalación anteriores se muestran en la Figura 3-6.

Figura 3-6. Instalación de la biblioteca cliente Web API

Inicializar HttpClient

Inicializar HttpClient

Desde el Explorador de soluciones, abra el archivo MainWindow.xaml.cs Agregue el siguiente código.

En el Explorador de soluciones, abra el archivo MainWindow.xaml.cs.

Agregue el siguiente código:

espacio de nombres WpfProductClient

{

usando System;

usando System.Collections.Generic;

usando System.Net.Http;

usando System.Net.Http.Headers;

usando System.Windows;

clase pública parcial MainWindow: Ventana

{

Cliente HttpClient = nuevo HttpClient();

ProductsCollection _products = nuevo ProductsCollection();

Ventana principal pública()

{

InitializeComponent();

client.BaseAddress = new Uri("pleto. La palabra clave await suspende la ejecución hasta que se complete la operación. Por ejemplo:< / p>

Como sus nombres lo implican, GetAsync y ReadAsAsync son métodos asincrónicos, lo que significa que regresan inmediatamente y no esperan a que se complete la operación. La palabra clave await suspende la ejecución hasta que se completa la operación. var respuesta = await client.GetAsync("api/products");

El código que aparece después de esta declaración no se ejecuta hasta que se completa la solicitud HTTP, pero eso no significa que el controlador de eventos se bloquee y espere. para que GetAsync se complete Todo lo contrario: el control regresa a la persona que llama. Cuando se completa la solicitud HTTP, la ejecución continúa desde el punto donde se suspendió.

El código que aparece después de esta declaración no lo hará. ejecutarse hasta que se complete la solicitud HTTP. Pero esto no significa que el controlador de eventos (controlador de eventos, también llamado controlador de eventos - Nota del traductor) bloqueará la espera de que se complete GetAsync. Todo lo contrario: el control vuelve a la persona que llama. Cuando se completa la solicitud HTTP, la ejecución se reanuda desde el punto de suspensión.

Si un método usa await, debe tener el modificador async:

Si un método usa await, debe tener el modificador async:

private async void GetProducts(remitente del objeto, RoutedEventArgs e)

Sin la palabra clave await, necesitaría llamar a ContinuarCon en el objeto Tarea:

Sin la palabra clave aguardar, necesitaría llamar a ContinuarCon en el objeto Tarea:

Sin la palabra clave await, necesitaría llamar a ContinuarCon en el objeto Tarea: ContinuarCon en:

privado void GetProducts(objeto remitente, RoutedEventArgs e)

{

btnGetProducts.IsEnabled = false;

cliente .GetAsync("api/products/2").ContinueWith((t) =>

{

if (t.IsFaulted)

{

MessageBox.Show(t.Exception.Message);

btnGetProducts .IsEnabled = true;

}

else

{

var respuesta = t.Resultado;

if (response.IsSuccessStatusCode)

{

response.Content.ReadAsAsync >().

ContinueWith(t2 =>

{

if (t2.IsFaulted)

{

MessageBox.Show(t2.Exception.Message);

btnGetProducts.IsEnabled = true;

}

else

{

var productos = t2.Resultado;

_products.CopyFrom(productos);

btnGetProducts.IsEnabled = true;

}

}, TaskScheduler.FromCurrentSynchronizationContext());

}

}

}, TaskScheduler.FromCurrentSynchronizationContext() );

}

Este tipo de código es difícil de hacerlo bien, por lo que se recomienda apuntar a .NET 4.5 o, si eso no es posible, instalar Async Targeting Pack.

Este tipo de código es difícil de corregir, por lo que se recomienda apuntar a .NET 4.5 o Si esto no es posible, instale el paquete Async Targeting.