Está en la página 1de 13

Taller: Introduccin a Windows Communication Foundation

Autor: Carlos Miln Figueredo Nivel: 100 (Principiante) Pre-requisitos: Visual Studio 2008 Email: cmilanf@dotnetclubs.com Web: http://www.dotnetclubs.com Duracin estimada: 60 minutos

Introduccin
Windows Communication Foundation (WCF de ahora en adelante) es la parte del Framework .NET dedicada a las comunicaciones. Este subsistema fue incorporado a .NET a partir de su versin 3.0 y est disponible para sistemas basados en Windows XP, Windows 2003 y superiores, as como dispositivos mviles equipados con el Compact Framework 3.5. WCF unifica varios modelos de comunicacin disponibles en versiones anteriores de .NET bajo una nica especificacin SOA (Service Oriented Architecture). Uno de los grandes atractivos de WCF es la facilidad con la que permite al desarrollador la creacin de servicios web interoperables y aplicaciones que hagan uso de los mismos. En este taller vamos a utilizar Visual Studio 2008 para crear, usando WCF, un servicio web que va a ser consumido por otra aplicacin cliente.

Descripcin del ejemplo: Cartelera de cine


Quin no ha ido alguna vez al cine? No importa si con la novia, con amigos, con la familia Lo ms comn a la hora de ir al cine es echar un vistazo a su cartelera para evaluar qu pelcula nos va a resultar ms interesante y/o ms entretenida de ver. Pero y si en el momento de decidir con los amigos qu pelcula ver no tenemos la cartelera a mano? No sera fantstico disponer de un servicio que nos exponga la cartelera actual en cualquier dispositivo que tengamos en el momento? (ej: nuestro telfono mvil) En este taller vamos a construir un sencillo servicio de ejemplo que nos permitir administrar un listado de estrenos de cine que se encuentran actualmente en cartelera.

Parte 1: Creando el servicio web


Crear tu primer servicio web va a ser ms sencillo de lo que imaginas! En primer lugar, vamos a preparar Visual Studio 2008 para la tarea que vamos a realizar: 1. Ejecuta Visual Studio 2008. 2. Vamos a crear un nuevo proyecto Biblioteca de servicios WCF. Para ello sigue el camino Men Archivo -> Nuevo -> Proyecto -> WCF 3. Escribe un nombre para tu proyecto y elige su ubicacin. En este ejemplo podemos usar el nombre ServicioEstrenosCine.

4. Va a ser conveniente crear tambin una solucin, que englobe tanto el proyecto de aplicacin servicio como el cliente. El nombre de la solucin podra ser WcfEstrenosCine.

5.

Tras aceptar vemos como se nos crea el proyecto, con cdigo de ejemplo para ayudarnos a construir el servicio. Sin embargo como queremos empezar desde 0, vamos a eliminar este cdigo. En el Explorador de soluciones elimina IService1.cs y Service1.cs.

Implementacin del servicio


1. Agregamos una nueva clase a nuestro proyecto, que podemos llamar EstrenoActual.

2. La clase debe estar compuesta por el siguiente cdigo:


using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.Runtime.Serialization;

namespace ServicioEstrenoCine { [DataContract] public class EstrenoActual { [DataMember] public string id; [DataMember] public string titulo; [DataMember] public string descripcion; [DataMember] public DateTime fecha; } }

Hay que prestar especial atencin a los elementos [DataContract] y [DataMember] as como al using System.Runtime.Serialization. Esta clase va a ser serializada en XML para que cuando expongamos el servicio cualquier cliente, sin importar su arquitectura, pueda entenderla. 3. Creamos una nueva clase, cuyo nombre va a ser IEstrenosCine. En efecto, se va a tratar de un interfaz. El cdigo ser el siguiente:
using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.ServiceModel;

namespace ServicioEstrenoCine { [ServiceContract] public interface IEstrenoCine { [OperationContract] int AgregarPelicula(EstrenoActual pelicula); [OperationContract] List<EstrenoActual> ObtenerCartelera(); [OperationContract] int EliminarPelicula(string id); } }

De la misma manera que con la clase EstrenoActual estamos especificando una serie de etiquetas adicionales: [ServiceContract], [OperationContract] y la inclusin de using System.ServiceModel. En efecto, en esta interfaz estamos especificando las operaciones disponibles sobre los datos de EstrenoActual. Las etiquetas permiten exponer estos mtodos en el servicio web.

4. Necesitamos una nueva clase que contenga la implementacin real de la interfaz que acabamos de disear. Esta ser la clase EstrenosCine.
using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.ServiceModel;

namespace ServicioEstrenoCine { [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class EstrenoCine : IEstrenoCine { List<EstrenoActual> estrenos = new List<EstrenoActual>(); public int AgregarPelicula(EstrenoActual pelicula) { pelicula.id = Guid.NewGuid().ToString(); pelicula.fecha = DateTime.Now; estrenos.Add(pelicula); return 0; } public List<EstrenoActual> ObtenerCartelera() { return estrenos; } public int EliminarPelicula(string id) { foreach (EstrenoActual pelicula in estrenos) { if (pelicula.id == id) { estrenos.Remove(pelicula); return 0; } } return 1; } } }

5. Llegado este punto podemos generar la solucin para ver si todo ha ido bien. Hemos terminado de escribir nuestro primer servicio web!

Configuracin de la conexin
Configurar la conexin es realmente sencillo y no requiere escribir ms lneas de cdigo. 1. Buscamos el archivo App.config de nuestra solucin y hacemos clic en l con el botn derecho. En el men podremos ver la opcin Editar configuracin del WCF.

2. Ahora podemos ver el programa de configuracin de WCF. Como al empezar el desarrollo eliminamos el servicio por defecto, debemos seleccionar el nombre adecuado del servicio.

3. La misma operacin debe repetirse para el extremo (endpoint) del servicio:

Prueba
Ya tenemos nuestro servicio listo para ejecutarse! Si ahora ejecutamos el proyecto con Visual Studio, nos aparecer automticamente el Cliente de prueba de WCF con el cual podremos probar los distintos mtodos que acabamos de crear.

Ahora que tenemos nuestro servicio ejecutndose, lo ms lgico es que queramos construirnos nuestro propio cliente que pueda acceder a la informacin y operaciones que ofrece.

Parte 2: Creando el cliente


Sin cerrar la solucin que hemos creado en la parte 1, vamos a aadir un nuevo proyecto que se convertir en nuestro cliente.

El nuevo proyecto ser una aplicacin de consola, que de nombre puede tener ClienteEstrenosCine.

Implementacin del cliente


La implementacin del cliente es tan sencilla como la del servicio. Empecemos por el primer paso: 1. Lo primero que nuestro programa necesita es saber que existe un servicio del que puede nutrirse. Esto lo podemos conseguir aadiendo una referencia al servicio. Desde el Explorador de soluciones y haciendo clic con el botn derecho en References seleccionamos Agregar referencia de servicio

2. Se nos preguntar por la direccin del servicio web. Como este servicio forma parte de la solucin global que estamos desarrollando, podemos dejar que Visual Studio lo detecte automticamente presionando el botn Detectar. Veremos cmo IEstrenosCine es detectado, junto con las operaciones disponibles. Escribimos un nombre para su espacio, por ejemplo ReferenciaEstrenosCine y aceptamos.

3. Automticamente se descargar en nuestro proyecto el cdigo necesario para acceder al servicio. Podemos observar las nuevas referencias disponibles haciendo clic con el botn derecho en ReferenciaEstrenosCine y seleccionado Ver en explorador de objetos.

4. Para poder instanciar la clase que hace de proxy con el servicio, necesitamos conocer el nombre del extremo (endpoint). Para ello debemos ir al archivo app.config de nuestro cliente y buscar en su declaracin el parmetro name. Copiaremos su valor al portapapeles:
<client> <endpoint address="http://localhost:8731/Design_Time_Addresses/ServicioEstrenosCine/Service1/" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IEstrenosCine" contract="ReferenciaEstrenosCine.IEstrenosCine" name="WSHttpBinding_IEstrenosCine"> <identity> <dns value="localhost" /> </identity> </endpoint> </client>

5. Hecho esto podemos empezar a escribir el cdigo de nuestra aplicacin cliente que ser:
using using using using using System; System.Collections.Generic; System.Linq; System.Text; ClienteEstrenosCine.ReferenciaEstrenosCine;

namespace ClienteEstrenosCine { class Program { static void Main(string[] args) { int op; EstrenoActual[] cartelera; EstrenosCineClient cliente = new EstrenosCineClient("WSHttpBinding_IEstrenosCine"); do { op = MuestraMenu(); switch (op) { case 1: cliente.AgregarPelicula(NuevaPelicula()); break;

case 2: cartelera = cliente.ObtenerCartelera(); foreach (EstrenoActual pelicula in cartelera) { Console.Write("\nId: {0}\n", pelicula.id); Console.Write("Ttulo: {0}\n", pelicula.titulo); Console.Write("Descripcin: {0}\n", pelicula.descripcion); Console.Write("Fecha: {0}\n", pelicula.fecha.ToString()); } Console.WriteLine("\nPresiona INTRO..."); Console.ReadLine(); break; case 3: Console.WriteLine("\nEscribe su ID: "); string id = Console.ReadLine(); cliente.EliminarPelicula(id); break; case 0: break; default: Console.Beep(); break; } } while (op != 0); } private static int MuestraMenu() { int resultado = -1; Console.Clear(); Console.WriteLine("Gestor de cartelera de cine"); Console.WriteLine("===========================\n"); Console.WriteLine("\t1. Agregar pelcula"); Console.WriteLine("\t2. Listado de pelculas"); Console.WriteLine("\t3. Eliminar pelcula"); Console.WriteLine("\t0. Finalizar"); while (resultado < 0 || resultado > 3) { Console.Write("\nSeleccione una opcin: "); resultado = Convert.ToInt32(Console.ReadLine()); } return resultado; } private static EstrenoActual NuevaPelicula() { EstrenoActual estreno = new EstrenoActual(); Console.Write("\nTtulo: "); estreno.titulo = Console.ReadLine(); Console.Write("Descripcin: "); estreno.descripcion = Console.ReadLine(); estreno.fecha = DateTime.Now; return estreno; } } }

Como se puede ver al inicio del cdigo, hemos pegado el nombre del endpoint que tenamos en el portapapeles como parmetro a la instancia de EstrenoCineClient. La mayor parte del cdigo es trivial, por lo que las lneas importantes relacionadas con la comunicacin con el cliente han sido resaltadas en amarillo. 6. Llegado este punto, querremos ejecutar nuestra aplicacin, pero necesitamos que tanto el servicio como el cliente se inicien al mismo tiempo. Esto se puede configurar en las propiedades de la solucin, a las que se puede acceder haciendo clic con el botn derecho en su nombre.

7. Marcamos ambos proyectos con opcin Iniciar para que se ejecuten cuando comience la depuracin de la solucin.

8. Llegado este punto, puede que no necesitemos que Visual Studio cargue su cliente WCF genrico cada vez que iniciamos la depuracin y en su lugar queramos que arranque nuestro propio cliente. Es posible modificar que aplicacin cliente va a

ejecutar el servidor. Para ello debemos acceder a las Propiedades del proyecto ServiciosEstrenosCine y en la pestaa Depurar cambiar el argumento de inicio:

Una vez hecho esto, deberemos modificar de nuevo las opciones de Proyectos de inicio mltiples para que nuestro cliente no se ejecute automticamente al iniciar la depuracin, ya que el servicio lo har por nosotros.

También podría gustarte