Você está na página 1de 11

WCF Gua Completa de Programacin. CAP. I.

Introduccin
Prlogo

Despus de un tiempo trabajando con WCF me estaba empezando a plantear escribir un libro, un libro til desde el punto de vista prctico
que da el trabajar en proyectos

.
Como tras evaluarlo detenidamente, supuse que esto me iba a suponer bastante tiempo del que no dispongo (ya sabemos todos lo que es
este trabajo de la informtica) pues he decidido en reducirlo al mximo y publicarlo en mis blogs para que adems est al alcance de todos.
Hasta a mi alcance, que a veces uno no se acuerda de cosas y tiene que echar mano del internet.
El principal problema cuando coges un libro es que depende mucho de quin lo haya escrito, para que podamos decir que este libro que
habla de tal tecnologa es un buen libro, no slo tiene que tratar los temas a fondo, sino que tienen que ser prcticos. Esto a
lamentablemente no pasa a menudo en los libros tcnicos, aunque ltimamente y en concreto los libros de Microsoft han mejorado bastante.
En resumen lo que voy a intentar en sucesivos captulos es tratar una de las tecnologas que ms me han atrado en los ltimos tiempos,
quiz por la aoranza de aquellos aos en que los que comenzamos a trabajar con DCOM nos sentamos como aventureros, en un mundo
como poca informacin en el que el prueba error era una constante.

Introduccin.

Una vez situados en antecedentes, creo que lo mejor es ver lo que sucesivamente voy a ir publicando, espero que con cierta constancia, en
sucesivos Post, los cuales harn el libro, mini-libro, o gua como le queris llamar de desarrollo con WCF.
Intentar poner ejemplos completos para lo que utilizaremos una base de datos que publicar como enlace descargable, cuando lleguemos al
punto en el que accedamos a datos.
Si estuviera escribiendo un libro de verdad, pues habra captulos dedicados a una introduccin real de que es WCF y dems paja, que creo
que lo mejor es que nos los saltemos y pasemos directamente a la chicha. Mi intencin es publicar 1 o 2 captulos a la semana, los cuales
estar encantado de completar con vuestros comentarios y sugerencias.
Con esto dicho, los distintos temas que tratar sern:
1.

Mi Primer servicio WCF

2.

Nociones Bsicas de Configuracin WCF.

3.

Hosting de Servicios WCF

4.

Contratos

5.

Configuracin Avanzada

6.

Instrumentacin en WCF

7.

Seguridad

8.

Transacciones

9.

El mundo Real

WCF Gua Completa de Programacin.


CAP. II. Mi Primer servicio WCF
Introduccin
Este en cualquier libro suele ser el tpico ejemplo de hola mundo, slo que en el caso de WCF creo que es bastante ms divertido.
En el mejor de los casos para hacer una simple llamada vamos a tener que escribir un montn de cdigo, esto que en un principio parece
engorroso, a la larga cuando estemos construyendo aplicaciones complejas ser una forma de poner orden a todo el mecanismo de desarrollo
de aplicaciones distribuidas.

Componentes de una Aplicacin WCF


Los que hayan trabajado con tecnologas antiguas basadas en COM o DCOM recordarn el duro camino de los CLSID para mantener las
referencias entre clientes, servidores, servidores con servidores, etc.
la verdadera potencia de WCF es haber acumulado no slo todas las tecnologas de aplicaciones distribuidas como Remoting, MSMQ, Sino el
haber utilizado el potencial de todo lo que se ha evolucionado en las arquitecturas internet B2B, SOAP
Para estructurar una aplicacin que exponga servicios y otra que los consuma, como veremos adelante es todo un mundo. De echo me
atrevera a decir que el 70% de WCF es configuracin o similar, mientras que el resto esta relacionado con el propio cdigo.
En este captulo no vamos a ver un ejemplo que sea el modelo a seguir para realizar una aplicacin cliente o servidor WCF, pero si va a sentar
las bases para entender todo lo que viene a continuacin.
Por eso esta aplicacin la escribiremos haciendo el menor nmero de lneas de cdigo posibles y pasando por alto temas como poder extraer
la configuracin del cdigo para llevarla a ficheros, ya que esto se ver ms adelante.
WCF est totalmente relacionado con SOA, es ms si no voy a a hacer una aplicacin que necesite SOA debo plantearme si WCF es la
solucin. Estoy harto de ver proyectos donde la gente empieza a meter tecnologas a saco sin pensar si es lo correcto, slo por estar a la
ltima.
Debemos tener en cuenta que los principios de SOA son permitir el desarrollo de nuevos requerimientos de negocio sin tener que reconstruir
toda la aplicacin entera, as como poder tomar nuestros bloques de aplicacin para construir bloques de procesos de negocio. Es decir que si
alguien est pensando en utilizar WCF para cacharrear tecnolgicamente lo debe pensar bien, puesto que el coste de horas de desarrollo es
elevado y debe tener una contrapartida en el negocio que al final es quien contrata los sistemas.
Por otro lado el utilizar WCF en cierto modo nos abstraer de tener que poseer determinados conocimientos como WSDL, etc. ya que WCF lo
har por nosotros.
Para definir WCF, hay que indicar que todo servicio est compuesto por al menos dos partes, el cliente y el servidor. El servidor expone los
servicios y el cliente los consume, todo ello mediante el intercambio de mensajes.
Para que un cliente y un servidor se comuniquen es necesario establecer lo que se ha dado en llamar el ABC de WCF, que no es ni ms ni
menos queAddress, Binding y Contract. O lo que es lo mismo.

Address: La direccin del servicio


Binding: El mecanismo de comunicacin
Contract: Los servicios que se exponen.

Estas tres cosas juntas se denomina Endpoint que son los puntos de conexin entre cliente y servidor. Es decir un cliente enva y recibe la
informacin a travs de sus EndPoints, as como un servidor escucha y responde a travs de sus EndPoints.
Unos ejemplos de estos tres elementos seran:

Address: http://servicios.acme.com:8001/serviciosuma
Binding: BasicHTTPBinding
Contract: [OperationContract] int suma(int x,int y);

Construccin de un Sistema WCF Bsico


Cmo he comentado anteriormente no se trata de hacer un servicio complejo con mltiples opciones de configuracin, ficheros de
configuracin, distintos tipos de endpoints, etc. En este primer ejemplo se trata de probar unas mnimas piezas, ejecutar y decir FUNCIONA!!
de tal forma que nos motive a seguir aprendiendo.
Otro tema a tener en cuenta es que los ejemplos que voy a poner en los distintos captulos van a ser muy sencillos de entender, ya que lo
importante no es averiguar que hace mi super ejemplo a nivel de negocio, sino entender la tecnologa que se utiliza.

El Servidor
Pues para empezar lo primero que haremos ser crear un Contrato, es decir construir algo que indique qu voy a exponer en mi servidor
WCF.
Para ello crearemos un nuevo proyecto, lo haremos desde cero sin utilizar ninguna plantilla. Es el mtodo que ms me gusta, primero
aprendemos por las bravas y luego wizards o similar, sino no hay quin entienda lo que se genera y como me enseo mi gran amigo Rido,
cuando un wizard te genera algo que no entiendes, lo mejor es quitarlo. Qu Razn tienes Rido!!!
Un contrato de debe definir como una interface y en el proyecto debemos tener agregada la referencia a System.ServiceModel, que es el
namespace que provee los objetos y atributos necesarios para construir servicios WCF.

Una vez agregada la referencia, podremos incluir la clusula using Sytstem.ServiceModel en nuestro Proyecto.
En este primer proyecto, vamos a incluir una funcin muy sencilla en la que enviaremos un par de enteros y la funcin nos devolver la
suma, resta, multiplicacin o divisin, en funcin de lo que indiquemos. Es decir la tpica calculadora.
Para ello definiremos primero el interface con los servicios que vamos a exponer.

[sourcecode language='csharp' ]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace IServicio
{

[ServiceContract]
public interface ICalculadora
{
[OperationContract]
int sumar(int x, int y);
[OperationContract]
int restar(int x, int y);
[OperationContract]
int multiplicar(int x, int y);
[OperationContract]
decimal dividir(int x, int y);
}
}
[/sourcecode]
En este cdigo del interfaz, hemos de fijarnos en dos cosas.
El interfaz lleva el modificador [ServiceContract] que indica un nuevo grupo de operaciones o Contrato que estamos estableciendo.
Tambin observamos como cada mtodo lleva un modificador [OperationContract] que indica una Operacin del Contrato que estamos
estableciendo.

El Servicio
Una vez que hemos establecido nuestro Contrato hemos de implementar el servicio que desarrollar nuestro interfaz.
Lo haremos en un proyecto diferente que agregaremos a nuestra solucin en el que implementaremos los cuatro OperationContract.
Este proyecto no presenta ninguna perculiaridad, salvo que agregamos como referencias el proyecto del interfaz y el espacio de nombres
ServiceModel.
No se incluyen validaciones o similar por claridad del cdigo, adems de que el tratamiento de excepciones se ver ms adelante.
El cdigo completo del Servicio sera el siguiente:
[sourcecode language='csharp' ]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Contratos
{
public class Calculadora : ICalculadora
{
public int sumar(int x, int y)
{
return x + y;
}
public
{

int restar(int x, int y)


return x - y;

}
public
{

int multiplicar(int x, int y)


return x * y;

public
{

decimal dividir(int x, int y)


return x / y;

}
}
}
[/sourcecode]

El Host
Para poder utilizar un servicio desarrollado mediante WCF ser necesario alojarlo en un componente, existen varias posibilidades, tales como
una aplicacin de consola, un servidor IIS,
Para nuestro primer ejemplo utilizaremos la aplicacin consola y crearemos toda la configuracin por cdigo.
Para ello a nuestra solucin agregaremos un nuevo proyecto de Consola.
Para poder hostear el servicio WCF, hemos de indicar los siguientes elementos en nuestro cdigo.
1.

ADDRESS. Definiremos la URL en la que expondremos el servicio y le asignaremos un nombre. En nuestro caso
Calculadora

[sourcecode language='csharp' ]
Uri miurl = new Uri("http://localhost:8080/Calculadora");
[/sourcecode]
1.

BINDING. Especificaremos el protocolo de comunicacin a nuestro servicio

[sourcecode language='csharp' ]
BasicHttpBinding elbinding = new BasicHttpBinding();
[/sourcecode]
1.

CONTRACT. Especificaremos el contrato de operaciones expuesto por nuestro servicio

[sourcecode language='csharp' ]
ServiceHost elhost = new ServiceHost(typeof(Calculadora), miurl);
[/sourcecode]
Despus de estos tres pasos, del ya comentado ABC de WCF abriremos el Host mediante una instruccin Open e implementaremos un
ReadLine sobre la consola para que no se nos cierre y se quede escuchando por la URL establecida.

[sourcecode language='csharp' ]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using Contratos;

namespace HostServicio
{
class Program
{
static void Main(string[] args)
{
Uri miurl = new Uri("http://localhost:8080/Calculadora");
ServiceHost elhost = new ServiceHost(typeof(Calculadora), miurl);
BasicHttpBinding elbinding = new BasicHttpBinding();
elhost.AddServiceEndpoint(typeof(ICalculadora), elbinding, "");
elhost.Open();
try
{

Console.WriteLine("Servicio alojado en " + miurl.AbsoluteUri);


Console.ReadLine();
}
finally
{
elhost.Close();
}
}
}
}
[/sourcecode]
Tras haber creado el Host, el siguiente paso es arrancarlo, para ello haremos un Build de la solucin y arrancaremos la aplicacin de consola
desde la carpeta Bin\Debug ejecutando como Administrador si estamos trabajando con Windows 7, Vista,.

Tambin podemos abrir la consola como administradores y navegar hasta la carpeta para ejecutar el host a mano

En cualquiera de los casos nuestra aplicacin quedar levantada indicandonos el mensaje que hemos introducido.

Para verificar que nuestro servicio est expuesto desde el internet explorer introduciremos la URL que indicamos en el apartado Address
del cdigo de la aplicacin HOST.

En esta imagen podemos observar quela aplicacin servidor ha desplegado nuestro servicio pero que el Metadata esta deshabilitado
actualmente, es decir, que las operaciones no estn expuestas va WSDL, esto se puede desactivar por configuracin, pero en nuestro caso de
momento lo vamos a hacer por cdigo mediante la inclusin de las siguientes lneas:
[sourcecode language='csharp' ]
ServiceMetadataBehavior metadatos = new ServiceMetadataBehavior();
metadatos.HttpGetEnabled = true;
elhost.Description.Behaviors.Add(metadatos);
[/sourcecode]
Con las que indicamos que queremos mostrar el Metadata, es decir mostramos la informacin del interface Contrato mediante reflexin de los
servicios que hayamos expuesto mediante el modificador [OperationContract]
Una vez incluidas estas lneas, si recompilamos y volvemos a introducir la url del servicio en el navegador, nos aparecer una ventana que nos
indica que mediante la herramienta svcutil podemos generar varios ficheros tales como el PROXY, necesario para nuestro cliente.

El cdigo completo por lo tanto del Host sera el siguiente:


[sourcecode language='csharp' ]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using Contratos;
using System.ServiceModel.Description;

namespace HostServicio
{
class Program
{

static void Main(string[] args)


{
Uri miurl = new Uri("http://localhost:8080/Calculadora");
ServiceHost elhost = new ServiceHost(typeof(Calculadora), miurl);
BasicHttpBinding elbinding = new BasicHttpBinding();
elhost.AddServiceEndpoint(typeof(ICalculadora), elbinding, "");
ServiceMetadataBehavior metadatos = new ServiceMetadataBehavior();
metadatos.HttpGetEnabled = true;
elhost.Description.Behaviors.Add(metadatos);
elhost.Open();
try
{
Console.WriteLine("Servicio alojado en " + miurl.AbsoluteUri);
Console.ReadLine();
}
finally
{
elhost.Close();
}
}
}
}
[/sourcecode]

El Cliente
El cliente que vamos a utilizar ser una aplicacin Winforms, muy sencilla en la incluiremos dos cajas de texto para los nmero x e y que est
esperando nuestro servicio, adems de unos botones para realizar las operaciones.
Para poder utilizar el cliente necesitamos el proxy, el cual generaremos mediante la utilidad svcutil como hemos indicado anteriormente. De
momento aadiremos la clase proxy y ms adelante en otros captulos explicaremos en detalle el por qu del proxy.
Para ello arrancamos el smbolo del sistema que viene con el propio Visual Studio y ejecutamos el comando atacando a la URL en la que
tenemos arrancado nuestro servicio mediante la consola.

Por su puesto la llamada la haremos desde la carpeta del cliente, as se nos generar en esta carpeta el proxy .cs que agregaremos al
proyecto posteriormente.

Podemos ver que se ha generado el .cs con el proxy el cual incorporamos a nuestro proyecto cliente.

El proyecto Cliente es muy sencillo, se codificar slo el mtodo sumar y se dejar el resto en el cdigo fuente para que quin se lo descargue
pueda finalizar el ejemplo.
Para poder utilizar el servidor es necesario agregar las referencias a ServiceModel y utilizar la clase que nos ha generado la herramienta
svcutil.
En el cdigo del cliente cabe destacar:
La creacin del Endpoint de Cliente
[sourcecode language='csharp' ]
EndpointAddress ladireccion =
new EndpointAddress("http://localhost:8080/Calculadora");
BasicHttpBinding elbinding = new BasicHttpBinding();
[/sourcecode]
La utilizacin del proxy
[sourcecode language='csharp' ]
CalculadoraClient lacalculadora =
new CalculadoraClient(elbinding, ladireccion);
[/sourcecode]
La llamada al mtodo sumar

[sourcecode language='csharp' ]
MessageBox.Show("Resultado " +
lacalculadora.sumar(int.Parse(txtX.Text),
int.Parse(txtY.Text)).ToString());
[/sourcecode]
El cdigo completo del cliente sera:
[sourcecode language='csharp' ]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ServiceModel;
namespace Cliente
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void cmd_add_Click(object sender, EventArgs e)
{
EndpointAddress ladireccion =
new EndpointAddress("http://localhost:8080/Calculadora");
BasicHttpBinding elbinding = new BasicHttpBinding();
CalculadoraClient lacalculadora =
new CalculadoraClient(elbinding, ladireccion);
MessageBox.Show("Resultado " +
lacalculadora.sumar(int.Parse(txtX.Text),
int.Parse(txtY.Text)).ToString());
}
}
}
[/sourcecode]
Como podemos ver si ejecutamos nuestro servidor y nuestra consola, la llamada FUNCIONA!!!

Este es el primer paso, a partir de ahora en los siguientes captulos se ir avanzando en configuracin, contratos, seguridad, etc.

Cdigo Completo.
El cdigo completo de este primer captulo lo podis descargar desde aqu:

Você também pode gostar