wcf-tier-visual-studio

En este tutorial crearemos un WebService en C# usando el WCF de Microsoft. Asi como en el tutorial anterior, este proyecto se hara en Capas. Se ocuparan 4 proyectos en total:

– WebService
– Entidades
– Negocio
– Datos

Para este ejemplo se trabajara con el .Net Framework 3.0

Primero creamos una solucion en blanco. Segundo, el proyecto WCF, tercero el proyecto de Negocio, cuarto el proyecto de Datos y finalmente el de Entidades.

1) Capa Web Service sera un proyecto WCF Service Application
2) Capa Negocio, Datos y Entidades sera un proyecto Class Library o Biblioteca de Clases (DLL)

Primero que nada, haremos la construccion de la solucion .NET desde un proyecto de solucion en blanco hasta completar los 4 proyectos involucrados. A continuacion la galeria con el paso a paso:

Una vez construido el proyecto “fisico”, hacemos paso a las refrencias que deben haber entre ellos:

crear-webservice-visual-studio-19crear-webservice-visual-studio-20crear-webservice-visual-studio-21

Aqui agregamos una referencia especial para la capa de entidades, que es la referida a la Serializacion de Clases:

crear-webservice-visual-studio-22

Ahora creamos las clases que tendran los metodos para trabajar en este WCF.

La idea es crear un Servicio que liste las ciudades por el numero de region que uno ingrese.

Partiremos desde la Capa de Datos hasta el Negocio, Entidades mediante:

Codigo Entidad Ciudad:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;

namespace WSEntidades
{
[DataContract]
[Serializable]
public class Ciudad
{
private string codigoCiudad;
private string nombreCiudad;

/// <summary>
/// Gets or sets CodigoCiudad
/// </summary>
[DataMember]
public string CodigoCiudad
{
get
{
return codigoCiudad;
}
set
{
codigoCiudad = value;
}
}

/// <summary>
/// Gets or sets NombreCiudad
/// </summary>
[DataMember]
public string NombreCiudad
{
get
{
return nombreCiudad;
}
set
{
nombreCiudad = value;
}
}
}
}

Codigo de Clase en Capa de Datos:

using System;
using System.Collections.Generic;
using System.Text;

using WSEntidades;

namespace WSDatos
{
public class CiudadDatos
{
public List<Ciudad> ListarCiudadesDatos(int region)
{
List<Ciudad> lista = new List<Ciudad>();
Ciudad ciudad = null;

switch (region)
{
case 1:
ciudad = new Ciudad();
ciudad.CodigoCiudad = "100";
ciudad.NombreCiudad = "Iquique";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "101";
ciudad.NombreCiudad = "Alto Hospicio";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "102";
ciudad.NombreCiudad = "Pozo Almonte";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "103";
ciudad.NombreCiudad = "Pica";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "104";
ciudad.NombreCiudad = "Huara";
lista.Add(ciudad);
break;
case 4:
ciudad = new Ciudad();
ciudad.CodigoCiudad = "400";
ciudad.NombreCiudad = "La Serena";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "401";
ciudad.NombreCiudad = "Ovalle";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "402";
ciudad.NombreCiudad = "Vicuña";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "403";
ciudad.NombreCiudad = "Illapel";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "404";
ciudad.NombreCiudad = "Los Vilos";
lista.Add(ciudad);
break;
case 8:
ciudad = new Ciudad();
ciudad.CodigoCiudad = "800";
ciudad.NombreCiudad = "Concepcion";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "801";
ciudad.NombreCiudad = "Talcahuano";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "802";
ciudad.NombreCiudad = "Chillan";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "803";
ciudad.NombreCiudad = "Los Angeles";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "804";
ciudad.NombreCiudad = "Penco";
lista.Add(ciudad);
break;
case 14:
ciudad = new Ciudad();
ciudad.CodigoCiudad = "1400";
ciudad.NombreCiudad = "Valdivia";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "1401";
ciudad.NombreCiudad = "Mariquina";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "1402";
ciudad.NombreCiudad = "Paillaco";
lista.Add(ciudad);
ciudad = new Ciudad();
ciudad.CodigoCiudad = "1403";
ciudad.NombreCiudad = "Panguipulli";
lista.Add(ciudad);
break;
default:
break;
}

return lista;
}
}
}

Codigo de clase en Capa de Negocios:

using System;
using System.Collections.Generic;
using System.Text;

using WSEntidades;
using WSDatos;

namespace WSNegocios
{
public class CiudadNegocio
{
public List<Ciudad> ListarCiudadesNegocio(int region)
{
List<Ciudad> lista = new List<Ciudad>();
CiudadDatos datos = new CiudadDatos();

lista = datos.ListarCiudadesDatos(region);

return lista;
}
}
}

Hasta aqui tenemos la parte “tradicional” de la programacion en 3 Capas. Pero ahora hay agregar el servicio WCF que hara de “entrada” para ser utilizado por terceras aplicaciones.

Al agregar el proyecto Web Service, se escojio el WCF Service Application (ver Galeria 1, 4a imagen). NO se ocupa el ASP .NET Web Service Application. EL WCF es la nueva forma de crear servicios mas flexibles que el antiguo asmx. Aqui puedes leer las diferencias entre WCF y ASMX  y en este otro articulo

“Simple and basic difference is that ASMX is designed to send and receive messages using SOAP over HTTP only. While WCF can exchange messages using any format (SOAP is default) over any transport protocol (HTTP, TCP/IP, MSMQ, NamedPipes etc).Reference : http://wcfanswers.blogspot.com/2012/06/wcf-vs-asmx-web-services.html

Aqui tambien una explicacion del proceso de creacion de un Servicio WCF

El proceso de creación de un servicio se divide en dos partes:

1. Definición y creación de un contrato: en éste definiremos la funcionalidad (métodos accesibles) que tendrá nuestro servicio y que datos (clases, estructuras, …) utilizará para comunicarse.
2. Creación de un servicio que “implemente” el contrato definido.

Agregaremos un servicio para consultar ciudades de la siguiente manera:

crear-webservice-visual-studio-29crear-webservice-visual-studio-30crear-webservice-visual-studio-31

Ya tenemos “construido” nuestro primer WCF. Pero falta “testear” este servicio. Como no es una “pagina”, tenemos que usar un utilitario que nos provee el mismo .NET Framework llamado WCFTESTCLIENT.EXE que se usa a nivel de comando de la siguiente forma:

crear-webservice-visual-studio-32 crear-webservice-visual-studio-33

Aca debemos ejecutar nuestro proyecto para poder testearlo con el utilitario:

crear-webservice-visual-studio-34

La URL de nuestro localhost la copiamos y la pegamos en la ventana de comandos para que sea ejecutada:

crear-webservice-visual-studio-35

El utilitario levanta nuestro WCF y esperamos que cargue los metodos que contiene (en este caso es solo uno):

crear-webservice-visual-studio-36 crear-webservice-visual-studio-37 crear-webservice-visual-studio-38

Cuando aparece nuestro metodo, hacemos doble click en el y vemos los parametros que solicita. Aqui puntualmente pide un numero de la Region que queremos consultar. Pondremos la Cuarta Region (4):

Vemos en la pantalla la salida que es una lista de entidades Ciudad con los datos que pusimos “a fierro” en la capa de datos.

Pero si nos damos cuenta, la salida de las Ciudades es en el orden “Numerico” que les dimos en la capa de datos. Queremos que sea alfabetico y para esto recurrimos a Generics (y codigo Lambda) para manipular la lista y ordenarla alfabeticamente de la siguiente forma:

crear-webservice-visual-studio-42

Nuevo codigo del metodo de la Capa de Negocios:

using System;
using System.Collections.Generic;
using System.Text;

using WSEntidades;
using WSDatos;

namespace WSNegocios
{
public class CiudadNegocio
{
public List<Ciudad> ListarCiudadesNegocio(int region)
{
List<Ciudad> lista = new List<Ciudad>();
CiudadDatos datos = new CiudadDatos();

lista = datos.ListarCiudadesDatos(region);

//ordenamos la lista en forma alfabetica con el metodo Sort
lista.Sort((p1, p2) => p1.NombreCiudad.CompareTo(p2.NombreCiudad));

return lista;
}
}
}

Ejecutamos de nuevo nuestro WCF con el utilitario y comprobamos que la salida ahora es ordenada en forma Alfabetica.

crear-webservice-visual-studio-43

El codigo fuente de este tutorial los pueden bajar aqui (Proyecto WCF)

Bueno, eso seria todo por hoy amigos. Saludos!

TYDW.-