Introducción a Windows Communication Foundation (antes conocida como Indigo)

Windows Communication Foundation es la nueva plataforma de Microsoft para crear aplicaciones distribuidas. Podríamos definirlo también como el modelo de programación unificado para crear aplicaciones distribuidas. Se lanzó al mercado como parte de .NET Framework 3.0 con la idea de consolidar y ampliar las API de versiones anteriores de Framework (por ejemplo, los servicios web ASP.NET, .NET Remoting, Enterprise Services (COM+) y Message Queuing).

 

Una de sus principales características es que cuenta con un modelo de programación unificado. Es la unificación de numerosas capacidades que antes podíamos encontrar en distintas tecnologías. Esto nos libra de tener que estar utilizando más de una tecnología para cumplir satisfactoriamente los requerimientos. De este modo, los desarrolladores harán una tarea de una única manera.

 

Las comunicaciones se enriquecen notablemente, ya que Windows Communication Foundation da la libertad al desarrollador de utilizar múltiples transportes, distintos tipos de formatos de mensajes y diversos patrones de mensajes.

 

La interoperabilidad es el plato fuerte de Windows Communication Foundation, ya que la comunicación es totalmente independiente de la plataforma. Los servicios utilizados son sobres de SOAP, cuyo contenido es nada menos que XML. Windows Communication Foundation está basado en la arquitectura de Web Services y utiliza los estándares establecidos.

 

El transporte es otra de sus cualidades fuertes, ya que éste se define con un protocolo neutral, de transporte neutral y formato neutral. Esto quiere decir que los servicios pueden utilizar tanto HTTP como TCP u otro mecanismo de transporte. Los desarrolladores tienen la posibilidad de agregar nuevos proveedores de transporte, y esto es indiferente al servicio. Windows Communication Foundation separa el “código” del “transporte”, y de esta manera soporta distintos métodos de comunicación, sin representar esto una carga de trabajo extra para el desarrollador.

 

 Teniendo una idea de lo que es WCF, abordaremos aspectos como las clases de servicio, los hosts de servicios, la configuración de servicios y los proxy de cliente.

 

Para empezar, cree una solución vacía denominada GettingStartedWithWCF.

 

wcf_intro_01

Clases de servicio

La clase de servicio implementa la funcionalidad que exponen las operaciones del servicio. Se trata de una clase .NET normal sin restricciones de herencia. Para habilitar una clase como clase del servicio, se aplican los atributos ServiceContract y OperationContract del espacio de nombres System.ServiceModel. Estos atributos pueden incluirse en la misma declaración de clase o simplemente en la declaración de una interfaz implementada por la clase. El uso de estos atributos no significa que la clase sea un servicio. Significa simplemente que la clase puede estar expuesta igual que un servicio.

Agregaremos un proyecto de biblioteca de clases para las clases de servicio. Para ello, haga clic con el botón secundario en la solución, seleccione Add | New Project y, a continuación, cree un proyecto de biblioteca de clases denominado ServiceLib.

wcf_intro_02

 

Cambie el nombre del archivo Class1.cs por MathService.cs

Agregue una referencia a System.ServiceModel.  Acabará usando este proyecto de manera habitual, ya que este ensamblado constituye la base de WCF.

Agregue dos métodos a la clase MathService: uno que agregue dos enteros (denominado Add) y uno que permita obtener el cuadrado de un doble (denominado Square). Agregue una instrucción Using al espacio de nombres System.ServiceModel y, a continuación, incluya en esta clase el atributo ServiceContract y en los métodos el atributo OperationContract.

using System.ServiceModel;

 

[ServiceContract]

public class MathService

{

    [OperationContract]

    public int Add(int x, int y)       

    {

        return x + y;

    }

    [OperationContract]

    public double square(double x)

    {

        return x * x;

    }

}

Como se ha mencionado anteriormente, estos atributos también pueden aplicarse a una interfaz. Para verlo, agregue una clase nueva al proyecto ServiceLib denominada HelloService y agregue el código que se muestra a continuación. 

using System.ServiceModel;

 

[ServiceContract]

public interface IHello

{

   [OperationContract]

   string SayHello(string name);

}

public class HelloService: IHello

{

    #region IHello Members

 

    public string SayHello(string name)

    {

        return "Hello " + name;

    }

 

    #endregion

}

Hosts de servicios

 

Para que la funcionalidad contenida en la clase del servicio esté a disposición de las aplicaciones cliente, se necesita un host de servicio. Se trata de una aplicación que escuchará las solicitudes de los clientes y creará instancias de la clase del servicio con el fin de procesar estas solicitudes. Con WCF, es posible usar IIS como host, pero también puede crearse una aplicación personalizada.

En este caso crearemos ambas clases de hosts, empezando por el hospedaje web. Haga clic con el botón secundario en la solución para agregar un sitio web. A continuación, seleccione Agregar | Nuevo sitio Web y elija la plantilla de servicio de WCF. Asegúrese de establecer la ubicación en una ruta de acceso del sistema de archivos en una carpeta del archivo de la solución

  wcf_intro_03

Veamos rápidamente el código del texto reutilizable de IService1.cs. La plantilla asume que vamos a codificar la funcionalidad para el servicio aquí, de modo que dispone de una interfaz y una clase de servicio de muestra con los atributos adecuados (además de un atributo DataContract).

Data Contract:

El Data Contract describe la estructura de datos que es manejada por las funciones del servicio.

También, con el Data Contract es posible especificar la estructura del tipo de datos que intercambia el servicio.

Permite, a la vez, convertir la estructura definida anteriormente en un XML Schema, el cual es un esqueleto de tipo datos y es un formato independiente de la plataforma utilizada.

Por último, define cómo se tienen que serializar y deserializar los nuevos datos.

Observación: en el caso de los tipos de datos simples (como un Integer, String, Boolean…), no es necesario crear un Contrato de Datos, ya que la conversión la realiza de manera automática. Sólo cuando se crean tipos de datos nuevos (como un objeto) se debe especificar el contrato de datos para su posible intercambio.

Ya hemos creado las clases de servicio en el proyecto de ServiceLib y, por lo tanto, ahora podemos eliminar el archivo Servicio.cs

Abra Service.svc y consulte los valores de los atributos. Los servicios de hospedaje web usan el mismo modelo que las antiguas tecnologías ASP.NET. Vinculan el archivo al que se pretende llegar con el archivo que contiene el código. Ésta es la misma técnica de código subyacente que se usa en ASP.NET.

<%@ ServiceHost Language="C#" Debug="true" Service="WcfService1.Service1" CodeBehind="Service1.svc.cs" %>

Dado que ya tenemos una clase de servicio compilada, podemos quitar este atributo y, a continuación, poner el nombre completo del tipo MathService como el valor para el atributo Service

 

<%@ ServiceHost Language="C#" Debug="true" Service="ServiceLib.MathService"%>

Finalmente, agregue una referencia al proyecto ServiceLib.

Esto es todo en cuanto al servicio de hospedaje web. Ahora seguiremos con el uso de aplicaciones personalizadas como hosts. Para ello, se puede usar una aplicación de Windows Forms, una aplicación de consola o bien un servicio de Windows. En este caso usaremos una aplicación de consola.

Haga clic con el botón secundario en la solución y elija Add | New Project. Cree una aplicación de consola denominada ConsoleServiceHost.

wcf_intro_04

Dado que necesitaremos crear referencias a System.ServiceModel (para la clase que realizará el hospedaje) y ServiceLib. (para la clase de servicio), primero agregue estas referencias.

Hacer que una aplicación .NET hospede un servicio es algo muy sencillo. Cree simplemente una instancia de tipo ServiceHost, asígnele el Type correspondiente a la clase de servicio que va a hospedar y, a continuación, llame el método Open. Este método Open hace que el host comience a escuchar las solicitudes. Como estamos usando una aplicación de consola, agregaremos una llamada a ReadLine para que la aplicación siga ejecutándose una vez abierto el host. También crearemos el host mediante una instrucción Using para asegurarnos de que se cierra y se elimina correctamente al cerrarse la aplicación de consola. Antes usamos MathService, así que ahora, para este proyecto, usaremos HelloService.

using System.ServiceModel;

static void Main(string[] args)

{

    Type t = typeof(ServiceLib.HelloService);

    using (ServiceHost host = new ServiceHost(t))

    {

        host.Open();

 

        Console.WriteLine("Service Started …");

        Console.ReadLine();               

    }

}

Configuración del servicio

Es posible que haya observado que, al configurar los hosts, no indicamos la manera en la que el cliente debe comunicarse con el servicio. Pues bien, esto se consigue mediante la configuración del servicio. Y aunque la configuración puede especificarse por medio de código, lo más habitual será hacerlo mediante XML en un archivo .config.

Para que un cliente pueda comunicarse con un servicio, se necesita un extremo. Un extremo está formado por tres componentes: una dirección, un enlace y un contrato. Éstos son los componentes fundamentales de WCF. La dirección es el URI que identifica dónde puede encontrarse el servicio. El enlace se usa para definir las reglas de la comunicación (por ejemplo, la codificación, si los mensajes necesitan ser protegidos, la manera en la que el servicio autenticará al cliente, etc.). Finalmente, el contrato define las operaciones expuestas por el servicio. Se trata básicamente de una referencia a la clase de servicio.

WCF dispone de varios enlaces integrados configurados para usos empresariales habituales (consulte la tabla que hay a continuación). Es posible personalizar estos enlaces mediante su configuración, aunque también es posible crear enlaces personalizados propios para adaptarlos a las necesidades del sistema. Para no complicar demasiado el proceso, usaremos el enlace básico HTTP, que sigue el protocolo SOAP 1.1.

 

Binding integrated

  

 

Ahora necesitaremos configurar los hosts. Empezaremos con la aplicación de consola. En primer lugar necesitamos un sitio para colocar la información de configuración, de modo que agregaremos un archivo app.config. Haga clic con el botón secundario en el proyecto y elija Add | New Item. A continuación, cree un archivo de configuración de la aplicación usando el nombre predeterminado (app.config).

Para configurar el extremo, se necesita una dirección, un enlace y un contrato. Veamos estos componentes en su orden inverso. El contrato ya quedó determinado a través del tipo de contrato que proporcionamos al constructor ServiceHost Para nuestra aplicación, será ServiceLib.IHello.. El enlace será basicHttpBinding, tal como ya mencionamos antes. Para la dirección usaremos "http://localhost:8081/HelloService&quot;,lo que significa que los clientes deberán enviar los mensajes a través del protocolo HTTP al puerto 8081 del servidor local usando HelloService como el nombre de aplicación. 

Para usar el asistente para la creación del proxy que se describe en la sección siguiente, debemos realizar un paso adicional. A diferencia de los servicios web ASP.NET, los servicios WCF no exponen una descripción del servicio (ni los metadatos) de forma automática. Por lo tanto, para habilitar esta característica, necesitamos agregar un comportamiento del servicio e indicarle a éste que use este comportamiento nuevo.

Reemplace todo el contenido del archivo app.config con el documento XML que se muestra a continuación para así configurar el host de consola.

 

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <system.serviceModel>

    <behaviors>

      <serviceBehaviors>

        <behavior name="mexEnabled">

          <serviceMetadata httpGetEnabled="true"

                           httpGetUrl="http://localhost:8081/HelloService" />

        </behavior>

      </serviceBehaviors>

    </behaviors>

    <services>

 <service behaviorConfiguration="mexEnabled" name="ServiceLib.HelloService">

        <endpoint address="http://localhost:8081/HelloService"

                  binding="basicHttpBinding"

                  contract="Service.IHello"></endpoint>

      </service>

    </services>

  </system.serviceModel>

</configuration>

La configuración del host web es prácticamente igual. Las diferencias son que la configuración XML se realiza en el archivo web.config, que no es necesario indicar una dirección para el extremo (ésta se determinará a través de la dirección del archivo Service.svc del servidor web) y que el contrato que el host web expone es MathService, no HelloService.

Configuración del cliente y proxy

Ya estamos preparados para crear la aplicación cliente. Haga clic con el botón secundario en la solución, elija Add | New Project, y cree una aplicación de Windows denominada ServiceClient.

wcf_intro_05

Para poder consumir los servicios, es necesario que configuremos antes el cliente y los proxy. Esta configuración es casi igual que la del servidor, ya que se requiere que un extremo sea compatible con los hosts del servicio. Los proxy son las clases del proyecto del cliente que se usan para representar los servicios; de esta manera permiten llamar las operaciones del servicio mediante una forma de tipos inflexible.

Afortunadamente, las extensiones de Visual Studio para .NET 3.0 incluyen un asistente que creará la configuración y los proxy necesarios mediante los metadatos del servicio. Lo único que se necesita es la dirección URL correcta del host del servicio.

Empecemos por el servicio de hospedaje web:

Para configurar el cliente para poder usar este servicio y crear la clase de proxy, haga clic con el botón secundario en el proyecto ServiceClient y elija la opción para agregar una referencia de servicio. Escriba la dirección URL del servicio para el Servicio URI y MathProxy para el nombre de la referencia del servicio y, a continuación, haga clic en Aceptar.

wcf_intro_06

Verá como la aplicación cliente ahora tiene un archivo app.config además de un archivo MathProxy en la carpeta denominada Service References.

Para el servicio hospedado en la consola, la dirección URL necesaria para tener acceso a los metadatos del servicio está almacenada en el archivo app.config. Si observa el atributo httpGetUrl del elemento serviceMetadata, verá que se configuró para http://localhost:8081/HelloService.

Antes de actualizar el cliente mediante el asistente para agregar referencias de servicio, debemos iniciar el host. Haga clic con el botón secundario en el proyecto ConsoleServiceHost y elija Debug | Start New Instance.

Cuando se esté ejecutando el host, haga clic con el botón secundario en el proyecto ServiceClient, elija la opción para agregar una referencia de servicio y escriba el URI adecuado en el campo del URI del servicio y HelloProxy para el nombre de la referencia del servicio.

Al abrir el archivo app.config en el proyecto ServiceClient, verá el archivo XML que se generó con el asistente. Para facilitar los ajustes de la configuración, el asistente coloca diversos atributos en el archivo junto con los valores predeterminados de configuración. Dado que no es necesario incluir los atributos con los valores predeterminados en la configuración, se puede simplificar el documento XML como el que se muestra a continuación.

La configuración contiene un elemento extremo para cada host, y los atributos de la dirección y del enlace de estos elementos coinciden con los valores de los hosts. Lo que sí es diferente es el contrato. Esto se debe a que el cliente no establece referencias con la clase original del servicio, sino que, en lugar de eso, establece referencias con un proxy del cliente generado por el asistente a partir de los metadatos del servicio.

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <system.serviceModel>

    <client>

      <endpoint  address="http://localhost:13419/WebServiceHost/Service.svc"

        binding="basicHttpBinding"

        contract="MathProxy.MathService"

        name="BasicHttpBinding_MathService" />

      <endpoint

        address="http://localhost:8081/HelloService"

        binding="basicHttpBinding"

        contract="HelloProxy.IHello"

        name="BasicHttpBinding_IHello" />

    </client>

  </system.serviceModel>

</configuration>

 

About justindeveloper

I am MCP (Microsoft Certified Professional). MCTS (Microsoft Certified Technology Specialist) and MCPD (Microsoft Certified Professional Developer), also I am SAP Business One Certified!! Desarrollando desde el IDE de Visual Studio NET 2003 hasta ahora con el Visual Studio NET 2010. Desde Microsoft SQL Server 2000 hasta ahora con el Microsoft SQL Server 2008 R2 y tambien con SharePoint, desde WSS 3.0 y MOSS 2007 y ahora familirizandome con el Sharepoint Foundation 2010 & Sharepoint Server 2010. The software development will follow being every time more wonderful!
This entry was posted in Development. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s