lunes, 30 de marzo de 2009

WCF en C++ (2 de 3)

En este artículo vamos a crear una aplicación de consola que hace de servidor e implementa la interfaz que definimos en el artículo anterior. A esta aplicación de consola, se conectará el cliente que crearemos en el siguiente artículo para obtener los datos.

Creación del servidor

Para implementar el servidor, añadimos una aplicación de consola del CLR a la solución actual. Y a continuación le agregamos las siguientes referencias:
  1. Una referencia al proyecto que hemos creado en el artículo anterior, que contiene la interfaz de la hipoteca
  2. Una referencia a System::ServiceModel (para evitar “error de la compilación” que aparece si no la hacemos)
Una vez añadidas estas referencias, procedemos a codificar la clase que implementa la interfaz IHipoteca, así que definimos una clase que deriva de IHipoteca y escribimos el código para el método CuotaMensual:
ref class CHipoteca : IHipoteca
{
public:
double virtual CuotaMensual(double capital, double interes, int meses)
{
double interes2 = interes / 100.0;
double div = 1 + interes2;
div = Math::Pow(div, -meses);
double resultado = capital * interes2 / (1 - div);
Console::WriteLine("Capital: {0}, interes: {1}, meses: {2}, resultado: {3}", capital, interes, meses, resultado);
return resultado;
}
};
En esta implementación del método se incluye el capital, la tasa de interés sin dividir por cien y el número de meses de la operación.
Una vez definido el objeto que va a dar servicio, vamos a crear el servidor. Para ello, usamos la aplicación de consola y ponemos el código necesario según WCF en el método main:
Uri^ direccionBase = gcnew Uri("net.tcp://localhost:888/Hipoteca");
ServiceHost^ servicio = gcnew ServiceHost(CHipoteca::typeid, direccionBase);
servicio->AddServiceEndpoint(IHipoteca::typeid, gcnew NetTcpBinding(), direccionBase);
servicio->Open();
Console::WriteLine("Servicio funcionando ...");
Console::WriteLine("Pulse una tecla para acabar");
Console::ReadKey();
return 0;
Ésta se trata de la parte más interesante ya que incluye el ABC de WCF:
  • A de “address”, se encuentra en la primera línea del código de arriba, en el objeto direccionBase;
  • B de “binding”, aparece en la tercera línea, cuando se hace gcnew NetTcpBinding();
  • C de “contract”, está en la tercera línea donde se hace IHipoteca::typeid.
En el siguiente artículo, veremos cómo crear un cliente que consume este servicio.
Hasta pronto.

3 comentarios:

ismasps dijo...

Hola,

estoy intentando hacer un aplicación cliente/servidor WCF con visual c++ 2005. He visto tu ejemplo pero no consigo que me funcione, además me falta la parte cliente.
Podrías enviarme el/los proyecto/s?
si es posible.
Gracias

ismasps dijo...

Hola,

estoy intentando hacer un aplicación cliente/servidor WCF con visual c++ 2005. He visto tu ejemplo pero no consigo que me funcione, además me falta la parte cliente.
Podrías enviarme el/los proyecto/s?
si es posible.
Gracias

José Ignacio Pérez Culla-González dijo...

Hola ismasps,
Tienes razón que me falta el cliente, así que en breve lo publicare para acabar con la serie.

Por lo que comentas dices que estás utilizando visual c++ 2005. Esa versión utiliza el .Net versión 2, en esta versión no se creo WCF que apareció con la versión 3 y con el Visual Studio 2008.
Prueba a hacer los ejemplos con VS 2008 o posterior.
Una cosa importante es agregar la referencia a System::ServiceModel, esto hay que hacerlo incluso con C#.
¿Puedes agreagar esta referencia?
Para hacerlo hay que ir al Explorador de soluciones y con el menu contextual "agregar referencia" o ver las propiedades del proyecto y ahí puedes agregar la referencia.
Por resumir:
1 Necesitas la versión 3.0 o superior de .Net (vs2005 usa la 2).
2 Agregar la referencia al ensamblado ServiceModel.

Un saludo.