Generando clientes de servicios web JAX-WS desde .NET

Es normal en mi trabajo que los servicios web que hacemos estén basados en tecnología Java y que, sin embargo, sean utilizados desde clientes con tecnología .NET. Si no se observan de forma rigurosa los estándares el utilizar diferentes plataformas tecnológicas puede llegar a dar problemas. Por eso es indispensable probar los servicios web en todas aquellas plataformas susceptibles de utilizarlos.

Esta entrada explica las dos herramientas más comunes para generar clientes .NET, que a la postre servirán para probar la compatibilidad entre plataformas; Wsdl.exe y Svcutil.exe.

Web Services Description Language Tool (Wsdl.exe)

Desde la versión .NET Framework 1.1 hasta la versión 2.x, para crear aplicaciones SOA, Microsoft ofrece el framework ASMX. Este framework simplifica la creación tanto de los servicios web como de sus clientes. Los servicios web creados a través de esta tecnología son invocados exclusivamente a través del protocolo HTTP. Es por eso que son conocidos como Web References.

Al crear un cliente de servicio web utilizando Web Reference, estamos utilizando por debajo la herramienta Wsdl.exe proporcionada por Microsoft.

Si en la plataforma donde vamos a ejecutar las aplicaciones estamos limitados a la versión 2.x, entonces el uso de esta herramienta es obligatoria. Sin embargo, si se dispone de la versión 3.x o superiores de .NET Framework, ASMX está obsoleto y conviene reemplazarlo por WCF.

Wsdl.exe genera los objetos .NET necesarios para crear un cliente que invoque las operaciones que publica el servicio web. Esta invocación se puede hacer, entre otras, a través del wizard que proporciona Visual Studio o bien a través de línea de comando.

Visual Studio 2005, al estar basado en .NET Framework 2.0, sólo genera clientes mediante ASMX (wsdl.exe).  Visual Studio 2008 a la hora de crear el cliente permite crearlo tanto con ASMX (wsdl.exe) como con WCF (svcutil.exe). La versión de 2010 directamente ya no permite crearlo con ASMX y se oculta esta opción en un botón de opciones avanzadas.

También se pueden obtener los objetos ASMX ejecutando la herramienta Wsdl.exe desde la consola. Esta herramienta se encuentra en el directorio <Program Files>\Microsoft SDKs\Windows\<version>\Bin\wsdl.exe.

La sintaxis de ejecución es:

wsdl [options] {URL | path}

ServiceModel Metadata Utility Tool (Svcutil.exe)

Windows Communication Foundation, conocido como WCF, es el nuevo framework que a partir de la versión 3.x proporcionó Microsoft para desarrollar aplicaciones SOA.

WCF viene a sustituir al framework ASMX y aunque está disponible desde la versión 3.x del .NET Framework no es sino hasta la versión 4.x donde se simplifica y generaliza su uso.

Los clientes de servicios web que se crean con ésta tecnología son conocidos como Service References.

La herramienta que Microsoft proporciona para la generación de Service References es ServiceModel Metadata Utility Tool (svcutil.exe). Esta herramienta sirve tanto para generar los objetos .NET a partir de un fichero wsdl, como para hacer el proceso inverso, generar un wsdl a partir de objetos .NET.

Svcutil.exe se encuentra en el directorio <Program Files>\Microsoft SDKs\Windows\<version>\Bin\svcutil.exe.

La sintaxis de ejecución es:

 svcutil.exe [/t:code] <metadataDocumentPath>* | <url>* | <epr>

El servicio web de ejemplo.

Para probar las generación del cliente .NET con las herramientas descritas, el servicio web de ejemplo es un viejo conocido del blog, ya que es el servicio CalculadoraService que creé en la entrada «Creando un servicio web mediante anotaciones JAX-WS utilizando un enfoque ascendente (bottom-up)«. En esta entrada se creaba un servicio web JAXWS que proporcionaba cuatro operaciones aritméticas básicas: suma, resta, multiplicación y división.

Este servicio web está publicado en un servidor de Weblogic y se puede acceder a su descriptor a través de la URL: http://localhost:7001/JaxWSEjemploWAR/CalculadoraService?WSDL.

Generando el cliente .NET desde Visual Studio con svcutil.exe.

La generación del cliente .NET utilizando Visual Studio es la manera más gráfica y sencilla. Para realizar esta operación se utiliza una versión de prueba de Visual Studio 2010 y el framework .NET versión 4.0. El lenguaje elegido para la implementación es C# por la similitud que tiene con Java.

Para no complicar en exceso el ejemplo se elige crear una aplicación de consola, ya que lo que importa es ver que la llamada al servicio web se hace correctamente, dejando de lado las dificultades que podrían suponer añadir elementos gráficos.

El nombre de la aplicación de consola será CalculadoraServiceServiceReference.

Console Application para probar el cliente mediante Service References

El siguiente paso es añadir una referencia de servicio web a la aplicación. Para ello en la ventana Solution Explorer se hace click botón derecho en el apartado References y se selecciona Add Service Reference.

Botón derecho sobre References y seleccionar Add Service Reference...

Se abre el wizard para añadir referencias a servicios. En el campo Address se escribe la URL del WSDL del servicio web que se quiere añadir como referencia; http://localhost:7001/JaxWSEjemploWAR/CalculadoraService?WSDL. El nombre de la referencia es CalculadoraServiceReference.

Se pega el WSDL del servicio al que hay que acceder

Automáticamente se generan los objetos .NET que se necesitan para comunicarse con el servicio web. La clase del cliente propiamente dicha y que se instanciará para obtener la funcionalidad del servicio web es CalculadoraPortTypeClient.cs.

Objetos generados por svcutil.exe

Finalmente, en el método Main de la aplicación de consola se instancia esta clase del cliente y se llama a cualquiera de sus operaciones. En el ejemplo, se llama a la operación suma mostrando su resultado por consola.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CalculadoraServiceServiceReference.CalculadoraServiceReference;
namespace CalculadoraServiceServiceReference
{
  class Program
  {
    static void Main(string[] args)
    {
      int operando1 = 10;
      int operando2 = 13;
      CalculadoraPortTypeClient cliente = new CalculadoraPortTypeClient();
      int resultado = cliente.suma(operando1, operando2);
      Console.WriteLine("CalculadoraServiceSvcutil Prueba Empírica");
      Console.WriteLine(operando1.ToString() + "+" + operando2.ToString() + "=" + resultado.ToString());
      Console.ReadKey(true);
    }
  }
}

El resultado es:

Resultado llamada mediante Service Reference

Generando el cliente .NET desde Visual Studio con wsdl.exe.

Para generar el mismo ejemplo, pero utilizando ASMX con la versión de Visual Studio 2010, se accede a la generación Web Reference de las opciones Avanzadas que presenta el wizard que añade referencias de servicio. Esta opción avanzada no hace otra cosa que lanzar el wizard para añadir referencias web que se basa en la herramienta wsdl.exe.

Para realizar este ejemplo, al igual que el anterior se crea una aplicación de consola.

El nombre de la aplicación de consola será CalculadoraServiceWebReference.

Se selecciona una aplicación de consola para crear el cliente mediante web references.

Se añade una referencia de servicio web a la aplicación. Para ello en la ventana Solution Explorer se hace click botón derecho en el apartado References y se selecciona Add Service Reference.

Botón derecho sobre References y se selecciona Add Service Reference...

En el wizard que se abre se pincha directamente en el botón Advanced….

Se pincha el botón Advanced...

Las opciones avanzadas permiten personalizar la creación del cliente, pero todavía basándose en svcutil.exe, que no es lo que se pretende. Para utilizar wsdl.exe se pincha el botón Add Web Reference.

Click en el botón Add Web Reference...

Se abre el wizard antiguo para la generación de clientes mediante Web Reference. En el campo URL se introduce el WSDL del servicio para el que se genera el cliente. En el campo Web reference name se introduce el nombre del objeto .NET que va a encapsular este cliente; CalculadoraServiceWebReference. Click en el botón Add Reference.

Se rellena la URL con el WSDL y automáticamente detecta las operaciones del Web Service. Click en el botón Add Reference.

Automáticamente se generan los objetos .NET que se necesitan para comunicarse con el servicio web. La clase que se instancia para hacer uso del cliente es CalculadoraService.

Objetos .NET del cliente basado en Web Reference.

Finalmente, en el método Main de la aplicación de consola se instancia la clase del cliente y se llama a cualquiera de sus operaciones. En este ejemplo, y para hacer que se parezca lo mejor posible al anterior, también se elige la operación suma.

El cliente generado con wsdl.exe, sin embargo, difiere del generado con la herramienta svcutil.exe. La llamada a la operación suma necesita dos parámetros booleanos, que antes no aparecían, y que indican si se han informado o no los operandos. Además, el resultado no es un retorno de función, si no que se devuelve en un parámetro output de entrada.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CalculadoraServiceWebReference.CalculadoraServiceWebReference;
namespace CalculadoraServiceWebReference
{
  class Program
  {
    static void Main(string[] args)
    {
      int operando1 = 10;
      bool operando1Informado = true;
      int operando2 = 13;
      bool operando2Informado = true;
      int resultado;
      bool resultadoInformado;
      CalculadoraService cliente = new CalculadoraService();
      cliente.suma(operando1, operando1Informado, operando2, operando2Informado, out resultado, out resultadoInformado);
      Console.WriteLine("CalculadoraServiceWebReference Prueba Empírica");
      Console.WriteLine(operando1.ToString() + "+" + operando2.ToString() + "=" + resultado.ToString());
      Console.ReadKey(true);
    }
  }
}

Pese a la diferencia de generación del cliente, el servicio web se invoca correctamente y el resultado de la suma se puede ver por la consola:

Resultado de la invocación al servicio web vía web references (ASMX)

Conclusión

Microsoft dió un paso adelante en la interoperabilidad entre plataformas y en el framework .NET 3.x incluyó WCF para el manejo de servicios web. Esta nueva tecnología sustituye al framework ASMX que ha quedado relegado a ser utilizado en aquellas arquitecturas donde todavía se emplea el framework .NET 1.1 o el 2.x.

De todas formas, ya hemos visto que Microsoft en su plataforma de desarrollo, permite desarrollar todavía con las dos tecnologías ASMX y WCF. Pero, salvo que estemos limitados por la versión de framework .NET, lo recomendable es utilizar WCF, ya que nos aportará más compatibilidad entre plataformas y una aproximación a los estándares mucho más fiable que ASMX.

Links

Deja un comentario