domingo, 19 de mayo de 2013

WCF - 5.1 Primer ejemplo (Consumiendo el servicio)

Tener un servicio disponible sirve de poco si no se puede utilizar. Para poder consumirlo, debemos implementar en nuestro cliente los pasos necesarios para poder hablar con el servidor. Vamos a encapsular toda la comunicación que tiene lugar, mediante un objeto proxy que se encargará de interactuar con las operaciones expuestas por el servidor. Así el proxy tendría un método por cada operación que expone el servicio. Al adaptar esto a nuestro ejemplo, el proxy tendría un objeto ReservaVuelos con un método  llamado ObtenerCodigoAeropueto que tomaría dos parámetros de entrada ciudad y pais, y devolvería una cadena como resultado. Encapsulado dentro de este objeto proxy, estaría toda la funcionalidad de intercambio de mensajes entre el cliente y el servidor.


Para construir nuestro proxy, vamos a utilizar una herramienta que viene con el sdk denominada svcutil que nos permite generar automáticamente el objeto proxy conociendo únicamente el objeto de descripción del servicio, es decir, el WSDL. Hay que tener en cuenta que el servicio debe estar activo y contar con permisos de escritura sobre el directorio donde se encuentra ubicado el ejecutable svcutil (c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\) . Vamos a crear un nuevo proyecto de librería de clases donde ubicaremos todos nuestros proxy y ejecutamos la siguiente linea de comandos en el cmd.

svcutil.exe /language:cs /out:ReservaVuelos.cs /config:app.config /namespace:*,WebServices.Proxy /ct:System.Collections.Generic.List`1 http://localhost:8080/ServicioReservaVuelos?wsdl




Después de ejecutar esta linea, se crearán 2 archivos. Uno de ellos es el fichero que contiene el objeto proxy y por defecto, se nombra igual que la implementación del contrato. En este caso, le cambiamos el nombre por ReservaVuelos.cs y el otro es un fichero de configuración que por defecto se le nombra output.config. En este caso, le cambiamos el nombre por app.config.


Buscamos estos dos archivos en la ruta donde se encuentra el svcutil.exe y los añadimos a nuestro proyecto de proxys. Recuerden que este proyecto debe tener una referencia a la libreria System.ServiceModel. 
Nuestro objeto proxy es el siguiente.


public partial class ReservaVuelosClient : System.ServiceModel.ClientBase<WebServices.Proxy.IReservaVuelos>, WebServices.Proxy.IReservaVuelos
    {
        
        public ReservaVuelosClient()
        {
        }
        
        public ReservaVuelosClient(string endpointConfigurationName) : 
                base(endpointConfigurationName)
        {
        }
        
        public ReservaVuelosClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress)
        {
        }
        
        public ReservaVuelosClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress)
        {
        }
        
        public ReservaVuelosClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress)
        {
        }
        
        public string ObtenerCodigoAeropuerto(string ciudad, string pais)
        {
            return base.Channel.ObtenerCodigoAeropuerto(ciudad, pais);
        }
    }


Ahora en un proyecto de presentación aparte, que para este caso vamos a utilizar uno de consola, vamos a hacer uso de este objeto proxy el cual nos ayudará a consumir las operaciones expuestas por nuestro servicio.








using System;
using System.ServiceModel;
 
using WebServices.Proxy;
 
namespace Presentacion.WebService.Console
{
    class Program
    {
        static void Main(string[] args)
        {
            EndpointAddress objAddress = new EndpointAddress("http://localhost:8080/ServicioReservaVuelos");
            BasicHttpBinding objBindig = new BasicHttpBinding();
            ReservaVuelosClient objProxy = new ReservaVuelosClient(objBindig,objAddress);
            bool blnContinuar = true;
            string ciudad = string.Empty;
            string pais = string.Empty;
            string continuar = string.Empty;
 
            do
            {
                try
                {
                    ciudad = string.Empty;
                    pais = string.Empty;
                    continuar = string.Empty;
 
                    System.Console.WriteLine("Ciudad: \n");
                    ciudad = System.Console.ReadLine();
                    System.Console.WriteLine("\nPaís: \n");
                    pais = System.Console.ReadLine();
 
                    System.Console.WriteLine(objProxy.ObtenerCodigoAeropuerto(ciudad,pais));
                    System.Console.WriteLine("\nContinuar: \n 1. Sí\n 2. No");
                    continuar = System.Console.ReadLine();
                    if(continuar.Equals("2"))
                    {
                        blnContinuar = false;
                    }
                }
                catch (Exception ex)
                {
                    System.Console.WriteLine("Ha ocurrido un error al intentar conectarse con el servicio: \n" + ex.Message);
                    blnContinuar = false;
                    System.Console.ReadLine();
                }
            } while (blnContinuar);
        }
    }
}

Creamos un EndPointAddress para indicar la dirección y puerto de conexión, así como un BasicHttpBinding para fijar el protocolo de comunicación. Estos dos objetos se pasan por parámetro al proxy ReservaVuelosClient que nos lo creó svcutil anteriormente. Seguidamente solicitamos los parámetros de consulta ciudad y pais para solicitar el código de aeropuerto relacionado. Llamamos al método ObtenerCodigoAeropuerto con los parametros necesarios y mostramos el resultado. El bloque try...catch es para controlar cualquier error que pueda ocurrir durante la comunicación.

Estos contenidos se publican bajo una licencia de Creative Commons Licencia Reconocimiento-No comercial-Compartir bajo la misma licencia 3.0 Colombia de Creative Commons

No hay comentarios:

Publicar un comentario