LLevaba tiempo queriendo testear los servicios web con mono, y hace un par de días se me presento la oportunidad. En el trabajo una tarea que nos llegó fue la de desarrollar y publicar un servicio web que publicara algunos datos de nuestra Base de Datos corporativa a una entidad
El caso fue sencillo pensamos, desarrollamos un servicio web ASP.NET y lo publicamos en nuestros servidores, pero mas tarde nos comunicaron que el servicio web iria en un servidor linux con apache. Hay fué cuando por fin pude mostrar la potencia de algo que yo ya conocia desde hace mucho tiempo pero que las empresas están siempre reticentes a utilizar: El proyecto Mono
Para ello, me pidieron una demo, un ejemplo de como funcionaban los servicios web en mono, que hacia falta para desplegarlo y toda la historia.
Bueno antes que nada, decir que si el servicio web lo desarrollamos con visual studio es solamente copiar el código del servicio web y correrlo con XSP. Pero la demo de la que voy a hablar hoy es de como hacerlo con Linux, desde herramientas libres, y añadiendo tambien una prueba para comprobar el funcioamiento en Mono de algunas de las caracteristicas nuevas de C# 3.0.
Para este articulo he utilzado:
Monodevelop OpenSuse 11 Mono Ximian Server Pages
Creando nuestro Servicio Web
El siguiente código es el servicio web que vamos a utilizar en la demostración, hay dos metodos simples, y uno que devuelve un objeto de una clase, para comprobar que podemos obtener de manera facil objetos.
<%@ WebService Language="C#" Class="Application.MyWebService" %> // file MyWebService.asmx // pauli at 20:16 13/11/2008 using System; using System.Web.Services; namespace Application { /// <summary> /// Clase Persona /// </summary> public class Persona { // Propiedades automaticas de C# 3 public string Nombre { get; set;} public string Apellidos {get; set;} /// <summary> /// Sobrescribimos el metodo ToString /// </summary> /// <returns> /// devuelve Apellidos, Nombre /// </returns> public override string ToString () { return this.Apellidos + ", " + this.Nombre; } } [WebService (Namespace = "http://tempuri.org/NumberService")] public class MyWebService : WebService { [WebMethod] public String HelloWorld (){ return "Hello World!!"; } [WebMethod] public String SayHeyToName (String name) { return "Hey, " + name + ". How are you?"; } [WebMethod] public Persona getPersona(){ // Constructores Anonimos de C# 3 Persona myPerson = new Persona() { Nombre = "Paulino", Apellidos = "Padial López" }; return myPerson; } } }
Este sería nuestro fichero MyWebService.asmx el cual contendría una clase Persona y un Servicio Web ASP.Net.
Para comprobar que funciona, desde la consola, podemos situarnos en la carpeta donde este nuestro fichero y escribir lo siguiente:
pauli@linux-quza:~/Mono Projects/Web Services Demo> xsp2
xsp2
Listening on address: 0.0.0.0
Root directory: /home/pauli/Mono Projects/Web Services Demo
Listening on port: 8080 (non-secure)
Hit Return to stop the server.
esto iniciará el servidor XSP en nuestro localhost en el puerto 8080, asi pues nos dirijimos al navegador y escribimos la direccion http://localhost:8080/MyWebService.asmx y deberíamos obtener una salida como la siguiente:

Esta pagina nos dá informacion sobre nuestro servicio web, de la que hablaremos en otra ocasión. En este caso lo que nos interesa es obtener el fichero WSDL que es el fichero de definición de nuestro servicio web. Groso modo es el fichero que dice la descripción del servicio, que metodos y paremetros tiene, etc.
Para obtener este fichero WSDL podemos hacer click en la opcion “Service Description”, y nos mostrara el fichero y una opción para guardarlo en disco.
Así mismo la opcion “Client Proxy” nos provee de una clase que contendrá el Objeto con sus metodos y propiedades para utilizar el servicio web en el código de nuestras aplicaciones, si observamos la pantalla veremos que tambien podemos descargarlo y ademas seleccionar el lenguaje de su codigo fuente.
El cliente proxy podemos generarlo “a mano” con el comando wdsl:
wsdl MyWebService.wsdl
esto nos generaría la clase MyWebService.cs
Una vez tengamos descargado el Client Proxy procederemos a compilarlo para generar una dll a utilizar en nuestro ejemplo.
pauli@linux-quza:~/Mono Projects/Web Services Demo> gmcs /target:library MyWebService.cs -r:System.Web.Services
el cual nos generará un fichero MyWebService.dll y esta la copiamos a la carpeta donde se encuentre nuestro proyecto donde la vayamos a utilizar.
Creando nuestra aplicacion de consola para usar nuestro servicio web
Para probar que todo funciona, decidí crear un nuevo proyecto de consola en monodevelop, boton derecho sobre References y a Editar Referencias. Una vez aqui, seleccionamos la tercera pestaña (”Ensamblados .NET”) y buscamos MyWebService.dll , ahora nuestro proyecto ya conoce nuestro Client Proxy !
El codigo de mi fichero Main.cs es el siguiente
// Main.cs created with MonoDevelop
// User: pauli at 20:40 13/11/2008
//
// To change standard headers go to Edit->Preferences->Coding->Standard Headers
//
using System;
namespace ConsoleServiceConsumerDemo
{
/// <summary>
/// Clase Persona
/// </summary>
class Persona {
// Propiedades automaticas de C# 3
public string Nombre { get; set;}
public string Apellidos {get; set;}
/// <summary>
/// Sobrescribimos el metodo ToString
/// </summary>
/// <returns>
/// devuelve Apellidos, Nombre
/// </returns>
public override string ToString ()
{
return this.Apellidos + “, “ + this.Nombre;
}
}
class MainClass
{
public static void Main(string[] args)
{
// Creamos un objeto del servicio Web
MyWebService service = new MyWebService();
// Ejecutamos los programas
Console.WriteLine(“Iniciamos el Test !”);
Console.WriteLine(“Recuperando información de la persona: “ + service.getPersona().Apellidos);
Console.ReadKey();
}
}
}
Como podeís observar hago uso de MyWebService que es el nombre de mi servicio web, y hago uso de sus metodos, abstrayendome de las llamdas del servicio o de terminos mas complicados como SOAP, XML, etc… haciendo uso de un objeto.
Ahora solo ejecutar y ver la salida del programada.
Documentación:
Mono Web Services
Códigos fuente del ejemplo:
TodoElCodigo.tar.gz
Escrito por Skull Monkey
Escrito por Skull Monkey
Escrito por Skull Monkey