Ejemplo Wcf

Embed Size (px)

Citation preview

  • 7/31/2019 Ejemplo Wcf

    1/13

    Autor: Carlos Miln Figueredo Email:[email protected]

    Nivel: 100 (Principiante)

    Pre-requisitos: Visual Studio 2008

    Web:http://www.dotnetclubs.com

    Duracin estimada: 60 minutos

    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.

    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 dedecidir 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.

    Crear tu primer servicio web va a ser ms sencillo de lo que imaginas! En primer lugar, vamosa 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 podemosusar el nombre ServicioEstrenosCine.

    Taller: Introduccin a Windows Communication Foundation

    Introduccin

    Parte 1: Creando el servicio web

    Descripcin del ejemplo: Cartelera de cine

  • 7/31/2019 Ejemplo Wcf

    2/13

    4. Va a ser conveniente crear tambin una solucin, que englobe tanto el proyecto deaplicacin 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 paraayudarnos 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.

  • 7/31/2019 Ejemplo Wcf

    3/13

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

    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 atratar de un interfaz. El cdigo ser el siguiente:

    De la misma manera que con la clase EstrenoActualestamos especificando una seriede 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.

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

    namespace ServicioEstrenoCine{

    [DataContract]publicclassEstrenoActual{

    [DataMember]publicstring id;[DataMember]

    publicstring titulo;[DataMember]

    publicstring descripcion;[DataMember]

    publicDateTime fecha;}

    }

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

    using System.ServiceModel;

    namespace ServicioEstrenoCine{

    [ServiceContract]publicinterfaceIEstrenoCine{

    [OperationContract]int AgregarPelicula(EstrenoActual pelicula);[OperationContract]List ObtenerCartelera();[OperationContract]int EliminarPelicula(string id);

    }}

  • 7/31/2019 Ejemplo Wcf

    4/13

    4. Necesitamos una nueva clase que contenga la implementacin real de la interfaz queacabamos de disear. Esta ser la clase EstrenosCine.

    5. Llegado este punto podemos generar la solucin para ver si todo ha ido bien. Hemosterminado 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 archivoApp.config de nuestra solucin y hacemos clic en l con el botnderecho. En el men podremos ver la opcin Editar configuracin del WCF.

    using System;using System.Collections.Generic;using System.Linq;

    using System.Text;using System.ServiceModel;

    namespace ServicioEstrenoCine{

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]publicclassEstrenoCine : IEstrenoCine{

    List estrenos = newList();

    publicint AgregarPelicula(EstrenoActual pelicula){

    pelicula.id = Guid.NewGuid().ToString();pelicula.fecha = DateTime.Now;estrenos.Add(pelicula);

    return 0;}

    publicList ObtenerCartelera(){

    return estrenos;}

    publicint EliminarPelicula(string id){

    foreach (EstrenoActual pelicula in estrenos){

    if (pelicula.id == id){

    estrenos.Remove(pelicula);return 0;

    }}return 1;

    }}

  • 7/31/2019 Ejemplo Wcf

    5/13

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

    adecuado del servicio.

  • 7/31/2019 Ejemplo Wcf

    6/13

    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.

  • 7/31/2019 Ejemplo Wcf

    7/13

    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.

  • 7/31/2019 Ejemplo Wcf

    8/13

    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.

    Parte 2: Creando el cliente

  • 7/31/2019 Ejemplo Wcf

    9/13

    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 quepuede nutrirse. Esto lo podemos conseguir aadiendo una referencia al servicio.

    Desde el Explorador de soluciones y haciendo clic con el botn derecho en References

    seleccionamosAgregar referencia de servicio

    2. Se nos preguntar por la direccin del servicio web. Como este servicio forma parte dela 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.

  • 7/31/2019 Ejemplo Wcf

    10/13

    3. Automticamente se descargar en nuestro proyecto el cdigo necesario para accederal 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 deproxycon el servicio, necesitamos conocerel 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:

    5. Hecho esto podemos empezar a escribir el cdigo de nuestra aplicacin cliente queser:

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using ClienteEstrenosCine.ReferenciaEstrenosCine;

    namespace ClienteEstrenosCine{

    classProgram{

    staticvoidMain(string[] args){

    int op;

    EstrenoActual[] cartelera;EstrenosCineClient cliente = new

    EstrenosCineClient("WSHttpBinding_IEstrenosCine");

    do{

    op = MuestraMenu();switch (op){

    case 1:cliente.AgregarPelicula(NuevaPelicula());

    break;

  • 7/31/2019 Ejemplo Wcf

    11/13

    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);

    }privatestaticint 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;}

    privatestaticEstrenoActual NuevaPelicula(){

    EstrenoActual estreno = newEstrenoActual();

    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 quetanto 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/31/2019 Ejemplo Wcf

    12/13

    7. Marcamos ambos proyectos con opcin Iniciarpara que se ejecuten cuando comiencela depuracin de la solucin.

    8. Llegado este punto, puede que no necesitemos que Visual Studio cargue su clienteWCF 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

  • 7/31/2019 Ejemplo Wcf

    13/13

    ejecutar el servidor. Para ello debemos acceder a las Propiedades del proyecto

    ServiciosEstrenosCine y en la pestaa Depurarcambiar 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.