Sunteți pe pagina 1din 7

Entendiendo Web Services con MonoDevelop III de IV

por Martin A. Marquez <xomalli@gmail.com>

Introduccin Si bien MonoDevelop nos ayuda a extraer todos los detalles de la programacin en Web Services, siempre es bueno y como manera de especializacin, conocer a fondo los elementos de toda la arquitectura que hay detrs del uso y la construccin de Web Services, este conocimiento nos ayudar a construirlos de una manera ms especializada, ya que puede haber escenarios donde no es posible tener la un IDE instalado como MonoDevelop o Visual Studio como es el caso de los servidores tanto de pruebas como de desarrollo. Por lo que no est de ms conocer las herramientas a nivel de consola para el trabajo con los Web Services. Entendiendo los estndares de los Web Services Una parte importante del xito de los Web Services como una solucin de interoperabilidad entre distintas plataformas, es que su arquitectura est basada en estndares abiertos y que una aplicacin que requiera utilizar los Web Services solo necesitar estar desarrollada por un lenguaje de programacin que tenga la capacidad de analizar y procesar XML (extended markup language). Esto hace posible que un Web Service construido en MonoDevelop, SharpDevelop o Visual Studio pueda ser consumido por una aplicacin Java o bien que un Web Service construido con NetBeans, Eclipse u otro IDE para Java pueda ser consumido por una aplicacin .NET. Los elementos esenciales de un Web Service son: HTTP (HyperText Transfer Protocol) Es el protocolo usado por los servidores Web para negociar el flujo de datos entre el servidor y el cliente. Los mensajes SOAP son mandados generalmente sobre canales HTTP Es un protocolo de mensajes XML que encapsula los tipos de datos y sus propiedades cuando se llaman los mtodos del Web Service. Es un metalenguaje de reglas semnticas que utiliza etiquetas para definir la sintaxis y estructura de la informacin en un documento de texto. Proporciona toda la informacin necesaria para crear la clase proxy, ya que le indica al cliente consumidor los mtodos que tiene el Web Service as como sus parmetros y el tipo de valor que regresan. Es un estndar para la publicacin de un Web Service en un directorio donde las empresas pueden buscan si existe un Web Service que cubra sus necesidades. Es un estndar para la creacin de un documento que agrupa un conjunto de enlaces de Web Services.

SOAP XML (Extensible Markup Language) WSDL (Web Service Description Language)

UUDI (Universal Description, Discovery and Integration) Disco (Discovery)

Consumiendo Web Services desde la lnea de comandos. Mono y .NET Framework nos provee de todas las herramientas necesarias para construir y utilizar Web Services desde la lnea de comandos, en este ejemplo construiremos una aplicacin de consola que consuma un Web Service cuya funcionalidad es similar al cdigo del Web Service utilizado en la parte dos de este tutorial. A continuacin se muestra el cdigo del Web Service. <%@ WebService Language="C#" Class="BeginService.WService3" %> using System; using System.Web.Services; using System.Web.Services.Protocols; namespace BeginService { [WebService (Name= "BeginService",Description = "BeginService",Namespace = "http://www.BeginService.example")] public class WService3 : WebService { [WebMethod(Description="Regresa el mximo comn divisor de 2 nmeros.")] public long MaxComunDivisor(long dividend, long divisor) { long r; while (divisor != 0){ r = dividend % divisor; dividend = divisor; divisor = r; } return dividend; } [WebMethod(Description = "Regresa una cadena para representar una fecha larga")] public string GetFecha() { DateTime dthoy = DateTime.Today; string[] meses = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" }; return dthoy.Day.ToString() + " de " + meses[dthoy.Month - 1] + " del " + dthoy.Year; } [WebMethod(Description = "Regresa true si la cadena es nmero, false si no lo es.")] public bool IsAnumber(string s) { bool resp; try{ resp = Single.IsNaN(float.Parse(s)) ? false : true; } catch (FormatException e){ SoapException se = new SoapException(e.Message,SoapException.ClientFaultCode, Context.Request.Url.AbsoluteUri); throw se; } return resp; } } }

A diferencia del cdigo utilizado en la segunda parte de este tutorial, en este se presentan algunas modificaciones que ayudan al manejo de excepciones en los Web Services, con esto el Web Service es capaz de informar al cliente que lo consume si se genero alguna excepcin al momento de la llamada de alguno de sus mtodos. public bool IsAnumber(string s) { bool resp; try{ resp = Single.IsNaN(float.Parse(s)) ? false : true; } catch (FormatException e){ SoapException se = new SoapException(e.Message,SoapException.ClientFaultCode, Context.Request.Url.AbsoluteUri); throw se; } return resp; } La clase SoapException representa la nica excepcin que es enviada por un Web Service cuando existe un error, el estndar SOAP define una manera de representar condiciones debido a la naturaleza interoperable de los Web Services, ASP.NET siempre enviar una SoapException al cliente sin importar que tipo de excepcin se haya generado, a continuacin algunas propiedades de SoapException. Message Obtiene el mensaje que describe la excepcin y representa la informacin contenida en la etiqueta <faultstring>. Indica el cdigo de falla que indica la causa de la excepcin y representa la informacin contenida en el <faultcode>. Indica el cdigo que causo la excepcin contenida en el elemento <faultactor>, generalmente es un URL. Obtiene un nodo XmlNode que representa el error especifico de la aplicacin, detalles de esta informacin est contenida en el <faultdetail>.

Code

Actor

Detail

Una vez instalado el Web Service en un servidor de aplicaciones (IIS, Apache) el siguiente paso es crear la clase proxy la cual se utilizar para que la aplicacin de consola pueda acceder a los mtodos del Web Service. En modo de prueba utilizaremos el comando xsp el cul ejecuta el mini servidor web de prueba para aplicaciones ASP.NET. En el directorio donde se encuentra el archivo del Web Service, ejecutamos el comando xsp como se muestra en la imagen siguiente:

Ejecutamos el navegador y abrimos el siguiente URL http://127.0.0.1:8080 o http://localhost:8080 en donde nos dirigimos a la mquina local en el puerto 8080 que es el puerto predeterminado xsp. El web service se ejecutar como se muestra en la imagen siguiente:

Mono y .NET proporcionan la herramienta WSDL.exe para generar la clase proxy de un Web Service, a continuacin algunos de sus parmetros y su descripcin: /username:[username] o /u:[username] /password:[password] o /p:[password] /namespace:[namespace] o /n:[namespace] /out:[filename] o /o:[filename] Especifica el usuario en caso de que el Web Service requiera credenciales para autenticacin. Especifica el password en caso de que el Web Service requiera credenciales para autenticacin. Especifica el nombre del ensamblado al que pertenecer la clase proxy. Proporciona el nombre del archivo en que se generar

/language:[cs|vb|js] o /l:[cs|vb|js]

Indica en que lenguaje de programacin se construir la clase proxy. Por default es [cs]

Con el Web Service ejecutndose, abrimos una terminal y ejecutamos el siguiente comando: $wsdl /out:BeginService.cs /namespace:BeginConsole http://localhost:8080/WService3.asmx?wsdl Con el cul obtendremos la clase proxy del Web Service. El resultado del comando se muestra en la siguiente imagen.

Una vez que tenemos la clase proxy generada, debemos compilarla junto con el programa de prueba, para esto la clase debe estar en el mismo directorio que el programa de consola, cuyo listado completo incluyendo la creacin del objeto y el uso de sus mtodos, se muestra a continuacin: using using using using using System; System.Web.Services; System.Web.Services.Protocols; System.Web; BeginConsole; //referimos el namespace

namespace BeginConsole //usamos el mismo namespace { public class Program { static int Main(string[] args) { //aqui usamos la clase proxy generada por //el wsdl BeginService proxy = new BeginService(); string sa,sb; long dividend = 0,divisor = 0; try { Console.WriteLine("Probando el Web Service"); Console.WriteLine("+----------------------------+"); Console.Write("Teclea el dividendo como entero > "); sa = Console.ReadLine(); if(proxy.IsAnumber(sa)) dividend = Convert.ToInt64(sa); Console.Write("Teclea el divisor como entero > "); sb = Console.ReadLine(); if(proxy.IsAnumber(sb)) divisor = Convert.ToInt64(sb); Console.WriteLine("===== OUTPUT ====="); Console.WriteLine("MCD: {0}",proxy.MaxComunDivisor(dividend,divisor)); Console.WriteLine("Today: {0}",proxy.GetFecha());

}catch(SoapException fe){ Console.WriteLine("Exception trapped: {0}",fe.Message); } return 0; } } }

Ahora compilamos las clases, con el siguiente comando: $ mcs -r:System.Web.Services *.cs Al ejecutar el programa si no hay una excepcin generada, veremos el resultado como la siguiente imagen:

Si ocurre una excepcin, por ejemplo si en lugar de un nmero ingresamos una letra veremos el resultado como en la siguiente imagen:

CONCLUSIN En esta parte mostramos como utilizar la herramienta WSDL.exe la cual es ms configurable para crear la clase proxy que hacerlo mediante un IDE como Visual Studio, SharpDevelop o MonoDevelop, esto en los casos que necesitemos flexibilidad para crear la clase proxy, adems de mostrar el mecanismo bsico para el manejo de excepciones y como ejecutar un Web Service en una aplicacin de consola cuyos pasos son los mismos para las aplicaciones de interfaz grfica o web, este conocimiento es necesario en los casos donde no tengamos acceso local al Web Service o no tengamos al alcance de la mano un IDE para .NET o Mono. Los ejemplos pueden ser descargados de http://www.humansharp.com/ Este documento est protegido bajo la licencia de documentacin libre Free Documentacion License del Proyecto GNU, para consulta ver el sitio http://www.gnu.org/licenses/fdl.txt , toda persona que lo desee est autorizada a usar, copiar y modificar este documento segn los puntos establecidos en la Licencia FDL

S-ar putea să vă placă și