How to Mono Web Services

Noviembre 26, 2008

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

GeSHi © 2004-2007 Nigel McNie, 2007-2008 Benny Baumann, 2008 Milian Wolff

// 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();
}
}
}

Parsed in 0.149 seconds at 6.77 KB/s

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


Proyecto: Aplicación instalación Mono from SVN y Plugins

Mayo 16, 2008

Estoy trabajando después de ver que no hay ( por favor  si alguien sabe donde hay uno que me lo diga ) en un script para automatizar la compilación de mono, monodevelop y los plugins/herramientas que ofrece el SVN Anonimo de Mono Project.

Una vez ya hize algo parecido, pero ahora la ide es un tipo automatix, sería ideal tener una interfaz donde señalar las opciones, ejemplo:

Mono, Monodevelop + aspeditor + gtkeditor2
Moonlight
Actualizar todo
Actualizar Mono solamente

el script lo estoy desarrollando para funcionar en debian, asi  que será extensible al resto de distros que vienen de ella.

Con esto pretendo automatizarme la instalación de estas herramientas, ya que son mis herramientas de desarrollo, así como su actualización y post-compilación automatizada.

IDEA: Sería ideal también que esta misma aplicación al arrancarla nos avisara de modificaciones en   el SVN y que si lo deseamos descarge/actualize/compile y lo deje todo andando.

Bueno, os iré comentando como lo llevo. He pedido a mario carrion acceso al Subversion de mono-hispano en la forja de novel para subir el proyecto.

Saludos!!


Mono Code Guidelines in PDF

Octubre 13, 2007

Estuve mirando en la página del proyecto Mono, la guia de estilo para escribir código. Quería tenerla en mi ordenador para poder ojearla “Off Line” o de facil acceso en mi Red Local, pero no encontre la guia en ningun otro formato en la Red.
Como no tenia sueño, la pase a OpenOffice, y la puse con letras grandes, resaltado de Rojo y Verde para los “goods” y “bads” y un indice. Despues lo exporte a PDF.

Y aqui os lo dejo:
         Mono Guidelines

Espero que os sirva.


CodeMonkey Song

Octubre 12, 2007

Increible, pero cierto. Después de leer los comentarios al primer post que puse en su dia cuando abrí el blog, y haciendo caso de Matt K, he visto por fin la cancion.

Hablo de CodeMonkey de Jonathan Coulton aquí os la dejo:


Probing Hosting with wordpress

Diciembre 2, 2005

This is the first post.