miércoles, 23 de julio de 2008

[WCF] El primer servicio

Bueno... como lo prometido es deuda vamos a ver como crear nuestro primer servicio usando WCF!!!! Jejeee... os embarga la emoción, eh??? ;-)

Cuando creamos un servicio en WCF, lo primero es pensar cual será su contrato, es decir, cuales serán las operaciones que este servicio expondrá a sus clientes. Por ejemplo, vamos a hacer un servicio calculadora, que servirá para realizar cálculos. Para ello, voy a definir que mi servicio tendrá los métodos Sumar, Restar, Multiplicar y Dividir. Este sería a grandes rasgos el contrato del servicio.

Como creamos un WCF en Visual Studio 2008? Pues nos vamos a "New Project" y dentro de la categoría WCF escogemos algo así como "WCF Service Library". Lo que vamos a crear será un assembly (concretamente una DLL) que contendrá uno o más servicios. Le pongo al proyecto el nombre de ServiciosCalculo.


 Lo primero que vemos es que VS ha creado el proyecto y le ha añadido tres archivos:
  1. App.config
  2. IService1.cs
  3. Service1.cs
El fichero App.config, es el fichero clásico de configuración de aplicación de .NET. Porque nos añade uno VS??? Pues bien, porque WCF se puede configurar usando el fichero App.config.


El fichero IService1.cs contiene una interfaz. Y que es esta interfaz? Pues el contrato de mi servicio, ni más ni menos. Además es lógico no? Cual es la manera de declarar los métodos que implementa una clase en .NET? Las interfaces. Pues WCF usa este mecanismo, y todo servicio en WCF debe implementar una interfaz.

Vamos pues a declarar el código de nuestro servicio. Modificamos el archivo IService1.cs para que quede así:
namespace ServiciosCalculo
{
    [ServiceContract]
    public interface ICalculadora
    {
        [OperationContract]
        double sumar(double a1, double a2);
        [OperationContract]
        double restar(double a1, double a2);
        [OperationContract]
        double multiplicar(double a1, double a2);
        [OperationContract]
        double dividir(double a1, double a2);
    }
}



Si os fijais la interfaz está decorada con el atributo [ServiceContract]. Esto le indica a WCF que esta es una interfaz que algún servicio implementará. Cada operación de la interfaz debe ir decorada con [OperationContract]. Si no ponemos [OperationContract] en el método, este pertenecerá a la interfaz, pero NO al contrato del servicio (es decir será un método no accesible desde WCF).

Ok, ya tenemos un contrato... y el servicio? Pues muy fácil, editamos el fichero Service1.cs para que quede algo así:

    public class CalculadoraService : ICalculadora
    {
        public double sumar(double a1, double a2)
        {
            return a1 + a2;
        }
        public double restar(double a1, double a2)
        {
            return a1 - a2;
        }
        public double multiplicar(double a1, double a2)
        {
            return a1 * a2;
        }
        public double dividir(double a1, double a2)
        {
            return a1 / a2;
        }
    }


Fijaos en una cosa: la clase que implementa el servicio NO tiene ninguna decoración especial. No usamos ningún servicio ni nada para indicar que esta clase es un servicio. El hecho que implemente una interfaz decorada con [ServiceContract] le basta a WCF para saber que esta clase es un servicio.

Venga... como se que la emoción os emarga!! Dadle a F5! Os preguntais que pasará??? Generalmente las DLLs no se pueden ejecutar (necesitamos un .exe), pero en el caso de las WCF Service Library, Visual Studio pone en marcha un host de servicios propio que nos permite probar nuestros servicios sin necesidad de hacernos una aplicación que los hospede ni un cliente!

Pues bueno... si le dais a ejecutar, aparece... un mensaje de error (algo así como "The client was unable to retrieve service metadata. Make sure the service is running and exposing metadata"). Oooops... nuestro gozo en un pozo.
Vamos a ver que ha pasado...

... la clave, como no podia ser de otro modo, está en el único fichero que no hemos tocado... el app.config.  En este fichero estan las configuraciones de todos los servicios de nuestra libreria. Recordad que un servicio debe tener un Endpoint: es decir, una dirección, un binding y un contrato. Lo del contrato lo tenemos claro, pero... vosotros habeis especificado una dirección (URI) para el servicio? Y un binding? No, verdad? Es que todo esto se especifica en el archivo de configuración.
VS.NET cuando hemos creado el proyecto ha creado uno para nosotros. No entraremos en detalles ahora (tendremos tiempo), pero echando una ojeada, descubrireis el problema: el fichero app.config generado por el Visual Studio utiliza los nombres IService1 y Service1 para declarar el servicio. Y estas clases no existen (les hemos cambiado el nombre), así que reflejamos los cambios en el app.config.

Concretamente los cambios a realizar son:
  • En el tag <service> el atributo name debe tener el nombre de la clase (en nuestro caso ServiciosCalculo.CalculadoraService).
  • En el tag <endpoint> el atributo contract debe tener el nombre del contrato, es decir de la interfaz. En nuestro caso ServiciosCalculo.ICalculadora.
 En principio no es necesario cambiar nada más. Compilad y ejecutad el proyecto de nuevo y os aparecerá el WCF Test Client:




Podeis ver que VS ha arrancado el WCF Service Host (para hospedar nuestro servicio) y un cliente de prueba (el WCF Test Client) para que podais probar el servicio. Haciendo doble click en uno de los métodos de nuestro servicio, el WCF Test Client lo invocará y nos mostrará el resultado. Aquí teneis un ejemplo de una llamada a dividir:


Que os parece? Fácil, no? Pues en el proximo post veremos un poco más en detalle como funciona el fichero app.config.
Hasta entonces.... nos leemos ;-)

4 comentarios:

Eudorax dijo...

Hola EPNA, Mil gracias por tu dedicacion a este espacio, en realidad ese tema tan interesante y que ultimamente ha hecho ruido tu lo has abordado de una manera tan sencilla y muy entendible, en lo personal muy contenta por lo que nos explicas.

Saludos, Eudorax

eiximenis dijo...

Hola Eudorax!

Es un placer que te guste el blog! Cualquier duda que tengas, ya sabes donde estoy, si puedo ayudar... yo encantado ;)

Un saludo!

Eudorax dijo...

Hola EPNA, soy de nuevo yo y en esta ocasión dandote lata, resulta que en la Odisea del .NET me he topado con esta otra tecnología y es el WorkFlow y he estado realizando algunas exploraciones a este apartadode Visual Studio, me preguntaba si tendrás algun ejemplo´, algo asi como [WF] El primer Flujo de Trabajo???.

Saludos.

eiximenis dijo...

Hola de nuevo!
Workflow Foundation jejeeee... ;)
Voy a intentar preparar algo de WF a ver si lo puedfo tener listo antes de vacaciones... esto si la calor no me funde antes :P!!!
Saludos!