martes, 21 de octubre de 2008

[WCF] Y finalmente, llegó el cliente!

Jejejee... pues sí! Finalmente veremos como crear un cliente para nuestros servicios WCF. En las sesiones anteriores, hemos visto como crear un servicio, configurarlo y hospedarlo. Pero de què serviria todo esto sin un cliente que consuma el servicio? Sinceramente para muy poco, así que vamos a ver como en un plis-plas creamos un cliente que se conecte a nuestro servicio...
Para este post voy a suponer que partimos de una solución que tiene ya tres proyectos:
  • Una WCF Service Library, es decir una dll con el código del servicio
  • Una console application con el servidor
  • Una winforms application con el esqueleto inicial del cliente.
El código para esta solución inicial lo podeis encontrar en: http://cid-6521c259e9b1bec6.skydrive.live.com/self.aspx/BurbujasNet/Wcf1/ServiciosCalculo|_INICIAL.zip

Si cargais la solución en VS2008, vereis los tres proyectos. Si les echais una ojeada observareis que:
  1. El proyecto ClienteCalculo solo tiene el formulario creado, sin código (lógico, es lo que vamos a hacer)
  2. El proyecto ServiciosCalculo tiene el código servicio (la interfaz y la clase que la implementa). El fichero de configuración del servicio no está en este proyecto
  3. El proyecto Servidor, tiene el código para hospedar el servicio, así como el fichero de configuración del servicio que indica los endpoints que tiene nuestro servicio. Si os fijais el proyecto de Servidor tiene una referencia al proyecto ServiciosCalculo.
Ahora estamos listos para empezar a codificar el cliente...
El primer paso será agregar una "Service Reference" desde el proyecto del cliente hacia el servidor. Para ello, haceis click con el botón derecho en el nodo "references" i le dais a "Add Service Reference". Esto nos despliega un cuadro de diálogo donde básicamente Visual Studio nos pregunta la URL en la que está corriendo el servicio.
Porqué necesita Visual Studio que el servicio esté corriendo? Muy fácil: para poder descargarse el archivo de metadatos que todo servicio WCF expone y que le permite a Visual Studio generar el proxy de forma automática. Bueno, dado que necesitamos que esté corriendo el servicio, vamos a poner en marcha el Servidor. Os vais a la carpeta bin\debug\ del proyecto Servidor y ejecutais Servidor.exe (jejeje.... si no habiais compilado la solución cerrad el cuadro de dialogo y compiladla ;-)). Ahora sí, con el servidor corriendo, os vais de nuevo al Visual Studio, y entrais la URL donde está el servicio (fijaos que el Servidor os dice la URL por la cual escucha el servicio). Si todo ha ido bien (que es de esperar que sí), Visual Studio os mostrará información sobre el servicio (básicamente que métodos tiene):
Entrad el namespace en el que quereis que se generen las clases proxy (p.ej. CalculadoraService) y cuando le deis a "Ok" visual studio generará las clases para poder acceder a nuestro servicio.
Que es lo que ha hecho visual studio en este punto?
  1. Ha generado unas clases proxy (dentro del namespace que nosotros le hemos dicho) para poder acceder al servicio wcf
  2. Ha añadido o modificado el fichero app.config de la aplicación cliente, para añadir la configuración WCF necesaria.
El segundo punto igual os sorprende: no estaba la configuración en el servidor? La respuesta es que está en los dos lados: en el servidor se definen todos los endpoints que soporta el servicio, mientras que en el cliente se define cual de los endpoints queremos usar.
Una vez generado todo esto, lo que queda es trivial: basta con usar las clases generadas dentro del namespace que le hemos indicado para llamar al servicio, como si de una llamada normal a .NET se tratara.
Por ejemplo, en el evento click del boton de sumar vinculais el método:
private void CmdSuma_Click(object sender, EventArgs e)
{
    double op1 = Double.Parse(txtOp1.Text);
    double op2 = Double.Parse(txtOp2.Text);
    // LLamamos al servicio
    ClienteCalculo.CalculadoraService.CalculadoraClient srv =
        new ClienteCalculo.CalculadoraService.CalculadoraClient();
    double resultado = srv.sumar(op1, op2);
    txtResultado.Text = resultado.ToString();
}
Fijaos como instanciamos la clase "CaluladoraClient" (la clase proxy generada por visual studio) y llamamos a sus métodos (en este caso sumar) que son los definidos en la interfaz del servicio.
Para probarlo, poneis en marcha el Servidor y ejecutais el cliente... y listos!

Evidentemente nos han quedado cosas por ver (como llamadas asíncronas)... ya iremos profundizando un poco más en WCF, pero de momento... ya tenemos lo básico!!! :)
Saludos!
PD: El código final lo teneis en http://cid-6521c259e9b1bec6.skydrive.live.com/self.aspx/BurbujasNet/Wcf1/ServiciosCalculo|_FINAL.zip (jejejeee... el cliente no está completado, eh? sólo suma, pero vamos el resto es trivial...).

No hay comentarios: