WCF (III): Creación de un cliente de un webservice


Ahora que ya hemos creado nuestro primer servicio, es el momento de consumirlo. Al igual que hicimos en ejemplos anteriores, comenzaremos creando un nuevo proyecto, por ejemplo de consola.

Es importante tener a mano la dirección del servicio, ya que nos hará falta para referenciarlo. Si estamos desarrollando el cliente en el mismo equipo en el que desarrollamos el webservice, bastará con copiar la dirección del WCF Test Client que Visual Studio creará por nosotros y que vimos en el artículo anterior.

Seleccionaremos la sección References del proyecto y haremos click derecho sobre ella, seleccionando la opción Add Service Reference… para añadir una referencia de servicio.

En el campo Address (dirección), insertaremos el valor que copiamos previamente. El hecho de que la dirección termine en mex indica que se trata el servicio de metadatos creado por defecto, que proporcionará la información sobre el resto de endpoints del servicio web. Más adelante profundizaremos en el concepto de endpoint y aprenderemos qué son, cómo configurarlos y cómo acceder a ellos.

Al pulsar el botón Go, se mostrarán los contratos de servicio disponibles junto a las operaciones que éstos pueden ejecutar.

Asignaremos un nombre al espacio de nombres del cliente y pulsaremos el botón Ok.

Si echamos un vistazo a nuestro fichero App.config, veremos que se ha añadido una nueva sección system.serviceModel que incluye información sobre el servicio web que acabamos de referenciar, mostrando un endpoint que cumple con los elementos ABC (Address, Binding, Contract). Toda esta información será recabada automáticamente del servicio web de metadatos mex referenciado en el paso anterior, por lo que no será necesario codificar absolutamente nada.


    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IClienteService" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8733/Design_Time_Addresses/WcfServices/Service1/"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IClienteService"
                contract="ClienteServiceReference.IClienteService" name="BasicHttpBinding_IClienteService" />
        </client>
    </system.serviceModel>

A continuación añadiremos la cláusula using que incluirá la referencia del servicio (espacio de nombres del proyecto + . + nombre que indicamos en el asistente al crear la referencia) e instanciaremos un cliente del servicio, pasándole como parámetro el nombre del endpoint al que queremos conectar.

Este nombre podemos consultarlo en el fichero App.config a partir del atributo name del endpoint correspondiente. En nuestro caso será BasicHttpBinding_IClienteService.


using WCFSimpleClient.ClienteServiceReference;

namespace WCFSimpleClient
{
    class Program
    {
        static void Main(string[] args)
        {
            ClienteServiceClient servicioCliente = new ClienteServiceClient("BasicHttpBinding_IClienteService");
        }
    }
}

Ahora procederemos a realizar las mismas operaciones que realizamos de forma manual con el cliente de prueba. Comenzaremos instanciando tres nuevos clientes.


            System.Console.WriteLine("INSERCIÓN\n-----------------------------");
            Cliente carlos = new Cliente()
            {
                Nombre = "Carlos Garcia Castaño",
                FechaNacimiento = new DateTime(1980, 2, 2)
            };

            Cliente ana = new Cliente()
            {
                Nombre = "Ana Gonzalez Sierra",
                FechaNacimiento = new DateTime(1981, 2, 22)
            };

            Cliente luis = new Cliente()
            {
                Nombre = "Luis Coria Chamorro",
                FechaNacimiento = new DateTime(1974, 6, 12)
            };

Una vez creados los objetos, invocamos el método InsertarCliente del servicio web referenciado pasándoselos como parámetro, y realizaremos una invocación a ObtenerClientes() para comprobar que todo es correcto.


            servicioCliente.InsertarCliente(carlos);
            servicioCliente.InsertarCliente(ana);
            servicioCliente.InsertarCliente(luis);
            System.Console.WriteLine("CONSULTA\n-----------------------------");
            var resultado = servicioCliente.ObtenerClientes();
            foreach (Cliente c in resultado)
            {
                Console.WriteLine(string.Format("\tID: {0}\tNOMBRE: {1}\t CUMPLEAÑOS: {2}/{3}",
                    c.IdCliente, c.Nombre, c.FechaNacimiento.Day, c.FechaNacimiento.Month));
            }

Realizaremos el mismo proceso con el método ModificarCliente()tras modificar, por ejemplo, el nombre de uno de los objetos que previamente recuperaremos del listado.


            System.Console.WriteLine("MODIFICACIÓN\n-----------------------------");
            Cliente clienteModif = resultado.First();
            clienteModif.Nombre = clienteModif.Nombre + " MODIFICADO";
            servicioCliente.ModificarCliente(clienteModif);
            resultado = servicioCliente.ObtenerClientes();
            foreach (Cliente c in resultado)
            {
                Console.WriteLine(string.Format("\tID: {0}\tNOMBRE: {1}\t CUMPLEAÑOS: {2}/{3}",
                    c.IdCliente, c.Nombre, c.FechaNacimiento.Day, c.FechaNacimiento.Month));
            }

Por ultimo, eliminaremos el segundo registro pasándole el identificador del cliente al método EliminarCliente().


            System.Console.WriteLine("ELIMINACIÓN\n-----------------------------");
            Cliente clienteEliminar = resultado.Skip(1).First();
            servicioCliente.EliminarCliente(clienteEliminar.IdCliente);
            resultado = servicioCliente.ObtenerClientes();
            foreach (Cliente c in resultado)
            {
                Console.WriteLine(string.Format("\tID: {0}\tNOMBRE: {1}\t CUMPLEAÑOS: {2}/{3}",
                    c.IdCliente, c.Nombre, c.FechaNacimiento.Day, c.FechaNacimiento.Month));
            }

Si ejecutamos nuestro programa a partir del código anterior, se mostrará lo siguiente:

Creación del cliente mediante svcutil.exe

Al igual que la herramienta sqlmetal.exe servía para generar código de forma automática a partir de la dirección de una base de datos, Visual Studio nos proporciona una herramienta que automatiza la creación de un cliente a partir de la dirección mex de un servicio web de una forma similar, denominada svcutil.exe. Para hacer uso de esta orden, abriremos en primer lugar la consola de desarrollo de Visual Studio.

A continuación, nos dirigiremos a la ruta donde queremos crear nuestro cliente y escribiremos lo siguiente:

svcutil.exe <dirección del endpoint mex>

Esto hará que se generen dos ficheros: una clase cliente junto a un fichero de configuración.

Ambos ficheros contendrán la funcionalidad necesaria (código y configuración) para realizar una conexión al servicio web, tal y como hacía la referencia al servicio de forma implícita.

Como podemos observar, también contienen la codificación de las invocaciones a los métodos del servicio.

En el siguiente artículo ampliaremos el concepto de endpoint y aprenderemos a crearlos, modificarlos y (sobre todo) entender un poco mejor de qué se tratan.

4 comments

  1. Saludos
    Interesante tutorial yo tengo un servicio alojado en windows azure y me gustaria poder consumirlo en android quisiera saber si no dispones de algun tipo de informacion al respecto , logre consumir el servicio mediante windows phone 8 , WPF , ASP MVC4 pero aun lo logro conectarme con android gracias

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s