En el post anterior, explique rápidamente que era la arquitectura SOA. En este post veremos que alternativa tenemos para cumplir con lo que nos indica esta arquitectura.
Microsoft desde ya hace unos años, viene trabajando con el concepto de Windows Communication Foundation (WCF). Voy a transcribir la definición oficial de WCF que nos da Microsoft en su página web.
Windows Communication Foundation (WCF) es un marco de trabajo para la creación de aplicaciones orientadas a servicios. Con WCF, es posible enviar datos como mensajes asincrónicos de un extremo de servicio a otro. Un extremo de servicio puede formar parte de un servicio disponible continuamente hospedado por IIS, o puede ser un servicio hospedado en una aplicación. Un extremo puede ser un cliente de un servicio que solicita datos de un extremo de servicio. Los mensajes pueden ser tan simples como un carácter o una palabra que se envía como XML, o tan complejos como una secuencia de datos binarios. A continuación se indican unos cuantos escenarios de ejemplo:
- Un servicio seguro para procesar transacciones comerciales.
- Un servicio que proporciona datos actualizados a otras personas, como un informe sobre tráfico u otro servicio de supervisión.
- Un servicio de chat que permite a dos personas comunicarse o intercambiar datos en tiempo real.
- Una aplicación de panel que sondea los datos de uno o varios servicios y los muestra en una presentación lógica.
- Exponer un flujo de trabajo implementado utilizando Windows Workflow Foundation como un servicio WCF.
- Una aplicación de Silverlight para sondear un servicio en busca de las fuentes de datos más recientes.
Gráficamente, veamos que podemos ganar implementando servicios WCF al momento de desarrollar nuestras aplicaciones.

Como podemos apreciar, WCF nos brinda un canal seguro de comunicación (a través de contratos) no solo entre aplicaciones de una misma máquina, sino a través de una red que puede estar conformada por servidores Windows o Linux (Interoperabilidad).
Bueno, basta de teoría y veamos como crear un proyecto del tipo WCF en Visual Studio 2010 y utilizando las características que nos da el .Net Framework 4.0
Paso 1: Definir el Contrato
Cuando hablamos de servicios, recuerda que siempre debe de haber un proveedor y un consumidor del servicio, por lo que es necesario definir cómo se llevará la comunicación entre estos dos entes. A este proceso le llamaremos: Definición del Contrato.
En el Contrato definiremos básicamente lo siguiente:
- Las operaciones que se podrán realizar.
- Las firmas y los tipos de datos que se enviarán y/o recibirán durante la invocación de las operaciones.
- Los protocolos y formatos de serialización que se utilizan para llevar a cabo la comunicación.
Luego de definido esto, recién podemos llevarlo a la programación.
Para el ejemplo voy a definir algo bastante sencillo. Haremos un contrato para permitir la realización de las siguientes operaciones básicas:
- Factorial de un número
long Factorial(long x);
- Devolver una Lista de enteros, con los "n" primeros números de la serie de Fibonacci.
List<int> Numeros_Fibobacci(int n);
- Suma de los primeros "n" números de la serie de Fibonacci.
double Sumatoria_Fibonacci(int n);
Paso 2: Creando un Proyecto del Tipo WCF Service Library
Luego de definido las operaciones y el contrato, vamos a crear una aplicación del tipo WCF Service Library, para implementarlos.
Luego de creada la aplicación te pediría que borres los archivos IService1.cs y Service1.cs para que aprendamos a crear los servicios, sin necesidad de una ayuda.
Luego de borrar ambos archivos, vamos a adicionar (Add New Item) a nuestro proyecto una Clase (llamado MiServicio) y una Interface (llamada IMiServicio). Te dejo la siguiente imagen para que veas a lo que me refiero.
Luego de creada la Clase y la Interface, debes de adicionar el siguiente using en ambas:
using System.ServiceModel;
Ahora si, vamos a programar las operaciones que hemos definido dentro de nuestro contrato. Empezaremos con la Interface.
Paso 3: Codificando la Interface
Luego de agregada la referencia, debemos de adicionar un atributo a nuestra interface, el atributo es [ServiceContract], quedando nuestro código de la siguiente forma:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace WCFServiceLibrary
{
[ServiceContract]
public interface IMiServicio
{
}
}
Ahora codificaremos sólo las firma de nuestra operaciones anteponiendo a cada una el atributo [OperationContract] , quedando nuestro código de la siguiente forma:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace WCFServiceLibrary
{
[ServiceContract]
public interface IMiServicio
{
[OperationContract]
long Factorial(long x);
[OperationContract]
double Sumatoria_Fibonacci(int n);
[OperationContract]
List<int> Numeros_Fibobacci(int n);
}
}
Paso 4: Codificando la Clase
Terminada la Interface, debemos de implementar cada Operación, esto lo hacemos en la clase, por lo que debemos de indicar, mediante un identificador, que la clase va a implementar los métodos definidos en la Interface.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace WCFServiceLibrary
{
//Al momento de definir la clase, indicamos que implementará los
//métodos de la Interface IMiServicio
public class MiServicio:IMiServicio
{
}
}
Luego implementamos los métodos que hemos definido.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace WCFServiceLibrary
{
//Al momento de definir la clase, indicamos que implementará los
//métodos de la Interface IMiServicio
public class MiServicio:IMiServicio
{
public long Factorial(long x)
{
if (x <= 1 ) return 1;
else
{
return x*Factorial(x - 1);
}
}
public double Sumatoria_Fibonacci(int n)
{
List<int> numeros = Numeros_Fibobacci(n);
return numeros.Sum();
}
public List<int> Numeros_Fibobacci(int n)
{
List<int> numeros = new List<int>();
int a, b, c;
a = 1;
b = 0;
for (int i = 0; i < n;i++ )
{
c = a + b;
numeros.Add(c);
a = b;
b = c;
}
return numeros;
}
}
}
Como puedes apreciar, la implementación de las operaciones la he utilizado de forma normal, sin ningún operador o atributo diferente a los que ya conoces.
Paso 5: Cambiando el Archivo de Configuración
Luego de definir el contrato, es necesario publicarlo para que pueda ser consumido, esto lo hacemos colocando el nombre del servicio, donde esta publicado, y el tipo de enlace que permitirá.
Voy a colocar parte del App.config para que veas que información se coloca por cada uno de los servicios:
<system.serviceModel>
<services>
<!-- Nombre del Servicio (Namespace.NombreClase) -->
<service name="WCFServiceLibrary.MiServicio">
<host>
<!-- Direccion del Servicio-->
<baseAddresses>
<add baseAddress = "http://localhost:8732/Design_Time_Addresses/WCFServiceLibrary/MiServicio/" />
</baseAddresses>
</host>
<!-- Service Endpoints -->
<!-- Unless fully qualified, address is relative to base address supplied above -->
<endpoint address ="" binding="wsHttpBinding" contract="WCFServiceLibrary.IMiServicio">
<!--
Upon deployment, the following identity element should be removed or replaced to reflect the
identity under which the deployed service runs. If removed, WCF will infer an appropriate identity
automatically.
-->
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<!-- Metadata Endpoints -->
<!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. -->
<!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
Luego de realizar los cambios podemos probar nuestros servicios, ejecutando nuestra aplicación con F5
Paso 6: Probando nuestro Servicio WCF
Al ejecutar la aplicación creada, Visal Studio, ejecuta WCF Test Client, añadiendo el servicio creado y las operaciones que este contempla, de forma que podremos probar si estas se ejecutan adecuadamente.
Para probar cada operación, basta con dar doble clic en una de ellas y en la pantalla que aparece, dar valores a los datos requeridos para luego invocarlos. Mira la siguiente imagen, donde pruebo la Función Factorial para un valor de x=5.
![]()
Como podrás ver, es bastante sencillo implementar un servicio WCF. Si bien es cierto he usado operaciones bastante sencillas, tu puedes utilizar lo aprendido aquí para trabajar con Base de Datos, por ejemplo, de forma que trabajes a través de servicios que a su vez puedan ser aprovechadas por otras aplicaciones. Espero te sea de ayuda este post para tus trabajos posteriores.
Artículos similares
Autor: Victor Parasi
Siempre es difícil escribir sobre uno mismo, qué contar, o por donde empezar, suele ser todo un dilema al momento de presentarse. Aquí vamos. Les diré que soy peruano, Ingeniero por vocación, dedicado a la docencia y siempre en la búsqueda de programar cada vez mejor. Aunque a veces algo terco, sé que no todo en la vida es blanco o negro. Existe el Open Source, y lo respeto pero me llevo mejor con el .Net. Si me hablas de preferencias, te digo que C#, C++, una buena película, colores oscuros, escribir, leer e investigar. Para terminar les diré que amo muchísimo a una mujer espectacular y que es la dueña de mi corazón.

Bueno Victor, lo primero que quiero es agradecerte a tí y a tu equipo por los aportes por los que queremos aprender. Desde hace años quiero aprender C++, pero siempre estoy sin un buen profe. Así que intento arreglarme con libros y tutoriales. Pero simpre tratan de enseñarte a programar en C++, o sea, el idioma. Pero claro, puedes saber mucho de muebles de madera, pero si no sabes manejar un formón, un serrucho, etc, no vas a llegar a nada. Tu tutorial sobre aplicaciones de consola fue uno entre muchos, pero el único que me sirvió. Ahora estoy con el siguiente, el II y en éste me travé. Cuando pides que se active el Common Lenguage, lo hice pero al llegar a que se debe “hacer referencia al namespace System”, no lo encuentro. Por eso te pido, y disculpa, ¿me ayudas?. Gracias. Mario