Tutorial WCF (5 de 5)

Artículos anteriores:
Tutorial WCF (1 de 5)
Tutorial WCF (2 de 5)
Tutorial WCF (3 de 5)
Tutorial WCF (4 de 5)

5 – CREANDO UN CLIENTE


La forma más fácil i rápida de crear un cliente/consumidor de un servicio de WCF es con la ayuda de Visual Studio. La forma de hacerlo es muy parecida a cómo lo hacíamos cuando se trataba de un Servicio Web del Framework 2.0: en nuestro proyecto donde queremos consumir un servicio tenemos la opción de Add Service Reference, pero en este caso la dirección que indicaremos no solo tiene porque ser http://…; también podemos introducir los diferentes protocolos net.tcp://…, net.pipe://… o net.msmq://… Al introducir una dirección correcta Visual Studio utiliza una herramienta que lee la metadata que le brinda el servicio (el contrato WSDL) y genera clase proxy que nos comunicará con el servicio. Podemos ver el código generado expandiendo la carpeta Service References en el explorador de soluciones. La herramienta utilizada por el Visual Studio para generar la clase proxy es el svcutil. Podemos generar nosotros mismos la clase proxy desde línea de comandos del SDK (Start->All programs->Microsoft Windows SDK->CMD Shell) (debemos tener el SDK de Windows instalado) utilizando la siguiente instrucción: (debemos ir primero al directorio donde queremos que se nos genere la clase)


svcutil http://localhost:8000/BlogWCF /out:Cliente.cs /config:App.config


Con esta línea le estaríamos diciendo que buscara un servicio que se encuentra en la dirección http://localhost:8000/BlogWCF, que leyera la metadata y generara la clase proxy en el fichero Cliente.cs y que la configuración de los bindings y enpoints necesaria para comunicarse con el cliente la guardara en un fichero llamado App.config.


Ahora ya sabemos como conseguir generar el código necesario para comunicarme con nuestro servicio. Vamos a generar un cliente que lo consuma y muestre algo por pantalla:


Creamos una proyecto de aplicación de consola y lo llamamos ClienteWCF. Yo lo he hecho en Visual Basic para cambiar un poco, pero eso va a gustos. Vamos a crear el proxy para el servicio de la forma rápida: con Visual Studio. Primero hacemos correr el servicio; si queremos usar el del servicio web ya estará corriendo en el IIS, si usamos el que se servía desde una aplicación Host debemos ejecutarla y dejarla funcionando. Hacemos click con el botón derecho encima del nombre de nuestro proyecto “cliente” y seleccionamos Add Service Reference. Ahora debemos colocar la dirección donde se encuentra escuchando nuestro servicio net.tcp://…, o http://…., le damos un nombre al espacio de nombres donde se va a crear nuestra clase proxy y le damos a Go. Nos mostrará una pantalla parecida a esta:


cliente


Le damos a OK y ya tenemos creada la clase proxy. Ahora ya podemos crear nuestro cliente, importar el espacio de nombres que le hemos dicho y empezar a utilizar nuestro cliente. El nombre de la clase proxy que invoca los métodos de nuestro servicio es el nombre de nuestro servicio acabado en Client: en nuestro caso MiServicioClient. Ahora podemos hacer que nuestro cliente invoque los métodos de nuestro servicio a través de la clase generada:



Imports ClienteWCF.BlogWCFReference
 
Module Module1
 
    Sub Main()
 
        Console.WriteLine(“Una vez este iniciado “ + _
            “el servicio presione una tecla para continuar.”)
        Console.ReadKey(True)
 
        Dim cliente As New MiServicioClient()
        Dim cumples As Cumple() = cliente.DameCumples()
        For Each cu As Cumple In cumples
            Console.WriteLine(“El cumpleaños de {0} es el {1}”, _
                    cu.Nombre, cu.FechaCumple.ToShortDateString())
        Next
 
        Console.WriteLine()
        Console.WriteLine(“{0} tiene ahora {1} años”, _
                          cumples(0), _
                          cliente.DimeEdad(cumples(0)))
 
        Console.WriteLine()
        Console.WriteLine(“Presiona una tecla para terminar.”)
        Console.ReadKey(True)
 
    End Sub
 
End Module

Para poder ejecutarlo el servicio debe de estar activado. Si no usamos el IIS como host sino una aplicación y además está en la misma solución, podemos decirle al Visual Studio que ejecute ambos proyectos a la vez: botón derecho en el nombre de nuestro solución y seleccionamos la opción Set StartUp Projects…. Escogemos la opción de Multiple stratup projects: , ponemos Start en Action tanto en el cliente como en la aplicación Host y aceptamos. Si ahora le damos a ejecutar se abrirán dos consolas: una para el cliente y otra para el host. Primero hacemos que empiece a ejecutarse el servicio y luego la aplicación cliente; el resultado debe ser parecido al siguiente:

addreference

Ahora ya sabemos como consumir un servicio de WCF.


Si ahora queremos que lo consuma usando el protocolo TCP no tenemos que hacer nada más que modificar el app.config del cliente. Si lo abrimos veremos que nos ha generado un archivo de configuración parecido a los de antes pero con algunas cositas más. Vemos que, por ejemplo, no solamente le dice que tipo de binding tiene el endpoint si no que también tiene una configuración especial para este binding. Como nosotros no indicamos nada especial en el App.config del servicio (cogimos la configuración por defecto de cada uno de los dos tipos de binding) y el cliente tiene el app.config que ha generado leyendo la metadata de nuestro servicio, los parámetros que hay son los mismos que los nuestros, los que hay por defecto. Podemos modificar el app.config para que acceda mediante TCP modificando solo la línea del endpoint:



<endpoint address=”http://localhost:8000/BlogWCF/Servicio”
                      binding=”basicHttpBinding”
                      bindingConfiguration=”BasicHttpBinding_IMiServicio”
                      contract=”BlogWCFReference.IMiServicio”
                      name=”BasicHttpBinding_IMiServicio” />

La cambiamos por esta otra:



<endpoint address=”net.tcp://localhost:8080/BlogWCF/Servicio”
                    binding=”netTcpBinding”
                    contract=”BlogWCFReference.IMiServicio”
                    name=”NetTcpBinding_IMiServicio” />

Si volvemos a ejecutar ahora el servicio y el cliente podemos ver que vuelve a funcionar; pero esta vez esta accediendo mediante el protocolo TCP. Como vemos tenemos completamente separadas la parte de comunicaciones de la de implementación.


Con esto acaba esta serie de posts/tutorial sobre como utilizar Windows Communication Foundation para crear, servir y consumir servicios. Espero que os haya ayudado.


Más adelante iré posteando cosas más avanzadas sobre WCF: servicios, bindings personalizados, seguridad, etc. Hasta pronto.

5 comentarios en “Tutorial WCF (5 de 5)”

  1. Muy bueno.

    Solo tengo un problema, en cliente.DimeEdad(cumples(0)) a mi me pone una serie de parámetros de más que ni se de donde salen ni se como se rellenan…para ser exactos, a parte de Cu para el cumple, un integer DimeEdadResult y un boolean DimeEdadResultEspecified.

    Solo ocurre cuando tengo que pasar parametros, sin no tengo que pasar parametros funciona bien.

  2. Que cosa más rara.

    Haciéndolo exactamente como dice el manual no te debería salir.
    Son parámetros por referencia. Si te creas una variable tipo Integer y otra tipo Boolean y se las pasas, una vez ejecutado el método éstas tendrán unos valores que te darán, supongo, el resultado y algo más.
    Esto me recuerda más a unas pruebas que hice para llamar métodos de un servicio asíncronamente. Mientras buscaba por internet sobre eso me encontré con una site donde se publicaba un bug sobre la utilidad svcutil que generaba una clase proxy cliente con algo parecido a lo tuyo.
    ¿Qué versión de SDK de Windows usas?
    ¿A lo mejor es ese bug?

  3. Mírate la clase proxy que te ha generado.

    En teoría te tiene que haber generado la clase proxy con los méodos correctos, vaya: con un solo parámetro. Si no es así es que se ha ejecutado “raramente” la herramienta svcutil.

    Mi clase proxy tiene el método DimeEdad con un solo parámetro:
    public int DimeEdad(client.ServiceReference.Cumple cu)
    Member of client.ServiceReference.MiServicioClient

  4. Hi !
    You’re publication is very good.

    I only want to tell you there is a very little mistake on the client interface configuration of the endpoint on this page :

    Thanks.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *