Crear una aplicación de cliente de OData v4 (C#)

por Mike Wasson

En el tutorial anterior, creó un servicio OData básico que admite operaciones CRUD. Ahora vamos a crear un cliente para el servicio.

Inicie una nueva instancia de Visual Studio y cree un nuevo proyecto de aplicación de consola. En el cuadro de diálogo Nuevo proyecto, seleccione Instalado>Plantillas>Visual C#>Escritorio de Windows y seleccione la plantilla Aplicación de consola. Asigne al proyecto el nombre "ProductsApp".

Screenshot of the new project dialog box, highlighting the path through the menu options, to create a new console application project.

Nota:

También puede agregar la aplicación de consola a la misma solución de Visual Studio que contiene el servicio OData.

Instalación del generador de código de cliente de OData

En el menú Herramientas, seleccione Extensiones y actualizaciones. Seleccione En línea>Galería de Visual Studio. En el cuadro de búsqueda, busque "Generador de código de cliente de OData". Haga clic en Descargar para instalar VSIX. Es posible que se le pida que reinicie Visual Studio.

Screenshot of the extensions and updates dialog box, showing the menu for downloading and installing the V S I X client code generator for O Data.

Ejecución local del servicio OData

Ejecute el proyecto ProductService desde Visual Studio. De forma predeterminada, Visual Studio inicia un explorador en la raíz de la aplicación. Anote el URI; lo necesitará en el paso siguiente. Deje la aplicación en ejecución.

Screenshot of the web browser's local host, showing the code of the Product Service project that is running on visual studio.

Nota:

Si coloca ambos proyectos en la misma solución, asegúrese de ejecutar el proyecto ProductService sin depurar. En el paso siguiente, deberá mantener el servicio en ejecución mientras modifica el proyecto de aplicación de consola.

Generación del proxy de servicio

El proxy de servicio es una clase .NET que define métodos para acceder al servicio OData. El proxy traduce las llamadas de método a solicitudes HTTP. Para crear la clase de proxy, ejecute una plantilla de T4.

Haga clic con el botón derecho en el proyecto. Seleccione Agregar>Nuevo elemento.

Screenshot of the solution explorer dialog box, showing the file path for adding a new item to the project, by highlighting the options in yellow.

En el cuadro de diálogo Agregar nuevo elemento, seleccione Elementos de Visual C#>Código>Cliente OData. Asigne a la plantilla el nombre "ProductClient.tt". Haga clic en Agregar y haga clic en la advertencia de seguridad.

Screenshot of the new items product app settings window, showing the O Data client product template, and circling the name field below to add new name.

En este momento, obtendrá un error que puede omitir. Visual Studio ejecuta automáticamente la plantilla, pero la plantilla necesita primero algunas opciones de configuración.

Screenshot of the error message window, showing one error tab and one warning tab, along with a detailed message of the error.

Abra el archivo ProductClient.odata.config. En el elemento Parameter, pegue el URI del proyecto ProductService (paso anterior). Por ejemplo:

<Parameter Name="MetadataDocumentUri" Value="http://localhost:61635/" />

Screenshot of the product client O Data dot config file, showing an example of the U R I after being pasted in the parameter element.

Vuelva a ejecutar la plantilla. En el Explorador de soluciones, haga clic con el botón derecho en el archivo ProductClient.tt y seleccione Ejecutar herramienta personalizada.

La plantilla crea un archivo de código denominado ProductClient.cs que define el proxy. A medida que desarrolle la aplicación, si cambia el punto de conexión de OData, vuelva a ejecutar la plantilla para actualizar el proxy.

Screenshot of the solution explorer window menu, highlighting the product client dot c s file that was created, which defines the proxy.

Uso del proxy de servicio para llamar al servicio OData

Abra el archivo Program.cs y reemplace el código reutilizable por lo siguiente.

using System;

namespace ProductsApp
{
    class Program
    {
        // Get an entire entity set.
        static void ListAllProducts(Default.Container container)
        {
            foreach (var p in container.Products)
            {
                Console.WriteLine("{0} {1} {2}", p.Name, p.Price, p.Category);
            }
        }

        static void AddProduct(Default.Container container, ProductService.Models.Product product)
        {
            container.AddToProducts(product);
            var serviceResponse = container.SaveChanges();
            foreach (var operationResponse in serviceResponse)
            {
                Console.WriteLine("Response: {0}", operationResponse.StatusCode);
            }
        }

        static void Main(string[] args)
        {
            // TODO: Replace with your local URI.
            string serviceUri = "http://localhost:port/";
            var container = new Default.Container(new Uri(serviceUri));

            var product = new ProductService.Models.Product()
            {
                Name = "Yo-yo",
                Category = "Toys",
                Price = 4.95M
            };

            AddProduct(container, product);
            ListAllProducts(container);
        }
    }
}

Reemplace el valor de serviceUri por el URI de servicio anterior.

// TODO: Replace with your local URI.
string serviceUri = "http://localhost:port/";

Al ejecutar la aplicación, debe generar lo siguiente:

Response: 201
Yo-yo 4.95 Toys