Posteado por: Carlos J. Valera A. | Septiembre 20, 2007

Windows Communication Foundation (WCF)

Guao!!!!

La tecnología aumenta cada vez más rápido y así mismo lo que las hace funcionar, tal es el caso de algo no tan nuevo pero que últimamente a dado que hablar tiene que ver con el .Net Framework y mas específicamente sobre WCF:

Windows Communication Foundation (WCF) es la plataforma de última generación de Microsoft diseñada para la creación de sistemas distribuidos. 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).

Si bien empezar a usar WCF no es difícil, sí hay un par de pasos durante el proceso que quizás no sean del todo claros. En este artículo le guiará a través del proceso de creación y consumo de dos sencillos servicios. Para conseguir nuestro objetivo, abordaremos aspectos como las clases de servicio, los hosts de servicios, la configuración de servicios y los proxy de cliente.

Lo siguiente que recomendamos es tener instalados Visual Studio 2005,.NET .NET Framework 3.0y las extensiones de Visual Studio 2005 para .NET Framework 3.0 (WCF y WPF).

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

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 Agregar | Nuevo proyecto y, a continuación, cree un proyecto de biblioteca de clases denominado ServiceLib..

Cambie el nombre del archivo Class1.vb por MathService.vb.. El nombre de la clase debería cambiarse automáticamente por MathService. Si no es así, lleve a cabo el cambio manualmente.

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 Imports 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.

Imports System.ServiceModel

<ServiceContract()> _
PublicClass MathService

<OperationContract()> _
PublicFunctionAdd(ByVal x AsInteger, ByVal y AsInteger) _
AsInteger
Return x + y
EndFunction

<OperationContract()> _
PublicFunction Square(ByVal x AsDouble) AsDouble
Return x * x
EndFunction

EndClass

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.

Imports System.ServiceModel

<ServiceContract()> _
PublicInterface IHello

<OperationContract()> _
Function SayHello(ByVal name AsString) AsString

EndInterface

PublicClass HelloService
Implements IHello

PublicFunction SayHello(ByVal name AsString) _
AsStringImplements IHello.SayHello

Return“Hello “ + name
EndFunction

EndClass

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.

Veamos rápidamente el código del texto reutilizable de Service.vb. 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,un tema que no entraremos a debatir en este artículo). Ya hemos creado las clases de servicio en el proyecto de ServiceLib y, por lo tanto, ahora podemos eliminar el archivo Servicio.vb.

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. 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=VB Service=”ServiceLib.MathService” %>

Finalmente, agregue una referencia al proyecto ServiceLib.

Ahora cree la solución. Una vez creada, el explorador de soluciones deberá parecerse al que se muestra a continuación.

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 Agregar | Nuevo proyecto. Cree una aplicación de consola denominada ConsoleServiceHost..

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.

Imports System.ServiceModel

Module Module1

Sub Main()
Dim t As Type = GetType(ServiceLib.HelloService)
Using host AsNew ServiceHost(t)
host.Open()

Console.WriteLine(“Service started…”)
Console.ReadLine()
End Using
EndSub

EndModule

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.

Nombre Transporte Codificación Interoperabilidad
basicHttpBinding HTTP/HTTPS Texto
netTcpBinding TCP Código binario No
netPeerTcpBinding P2P Código binario No
netNamedPipeBinding IPC Código binario No
wsHttpBinding HTTP/HTTPS Texto, MTOM
wsFederationBinding HTTP/HTTPS Texto, MTOM
wsDualHttpBinding HTTP/HTTPS Texto, MTOM
netMsmqBinding MSMQ Código binario No
netIntegrationBinding MSMQ Código binario

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 Agregar | Nuevo elemento. 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”,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=”ServiceLib.IHello” />
</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.

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

<?xml version=”1.0″?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name=”mexEnabled”>
<serviceMetadata
httpGetEnabled=”true” />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service
behaviorConfiguration=”mexEnabled”
name=”ServiceLib.MathService”>
<endpoint
address=”"
binding=”basicHttpBinding”
contract=”ServiceLib.MathService” />
</service>
</services>
</system.serviceModel>
</configuration>

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 Agregar | Nuevo proyecto, y cree una aplicación de Windows denominada ServiceClient..

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. Dado que elegimos un sitio web basado en archivos, necesitamos saber el número de puerto que usa Visual Studio. Éste puede averiguarse mediante la ventana de propiedades. Haga clic en el proyecto del sitio web y busque el número de puerto. En la aplicación de muestra, el número de puerto es el 13419.

Al agregar el nombre del proyecto web (WebServiceHost) y el nombre del archivo svc (Servicio.svc), obtenemos la dirección URL http://localhost:13419/WebServiceHost/Service.svc.

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.

Verá como la aplicación cliente ahora tiene un archivo app.config además de un archivo MathProxy.map en la carpeta denominada Service References. Hablaremos de estos aspectos con más detalle tras haber agregado una referencia al servicio hospedado en la consola.

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 Depurar | Iniciar nueva instancia.

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.

Una vez agregada la referencia, asegúrese de detener el host de la consola. Deberá comprobar que HelloProxy.map se haya agregado a la carpeta Service References del proyecto del cliente.

Al abrir el archivo app.config en el proyecto ServiceClient, verá el archivo XML que se generó con el asistente. Parece complejo, pero no lo es. 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>

Las clases de proxy se encuentran ocultas en el Explorador de soluciones. Esto se debe a que se trata de código generado que no debe ser modificado. Para verlas, haga clic en la solución ServiceClient y, a continuación, en el botón Mostrar todos los archivos en la barra de herramientas del Explorador de soluciones. Hecho esto, se puede expandir HelloProxy.map y MathProxy.map para poder consultar los archivos.

Una vez que tenemos las referencias de servicios configuradas, podemos crear una interfaz de usuario para poder probar estos últimos. Agregue tres cuadros de texto y dos botones a Form1 con los nombres que se muestran debajo de los controles en rojo. Proporcione los valores predeterminados de estos cuadros de texto para facilitar la prueba de las operaciones de los servicios.

Al hacer clic en SayNameButton,deseamos llamar el método SayHello desde HelloServicey pasar el contenido de NameTextBox como un parámetro. Se puede usar un MsgBox para mostrar los resultados. Al hacer clic en AddButton,deseamos llamar el método Add de MathServicey pasar el contenido de XTextBox e YTextBox convertidos a Integercomo parámetros. Después, se puede usar un MsgBox para mostrar los resultados.

PublicClass Form1

PrivateSub SayNameButton_Click( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles SayNameButton.Click
Using ws AsNew HelloProxy.HelloClient
MsgBox(ws.SayHello(NameTextBox.Text))
End Using
EndSub

PrivateSub AddButton_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles AddButton.Click
Dim x AsInteger = Integer.Parse(XTextBox.Text)
Dim y AsInteger = Integer.Parse(YTextBox.Text)

Using ws AsNew MathProxy.MathServiceClient
MsgBox(ws.Add(x, y).ToString())
End Using
EndSub

EndClass

Al ejecutar el cliente, debemos asegurarnos de que el host de la consola también se ejecuta (debe ser así para poder escuchar las solicitudes realizadas a HelloService).). Para ello, se pueden usar diversos proyectos de inicio. Haga clic con el botón secundario en la solución y elija Propiedades. Configure las propiedades de inicio tal como se muestra a continuación y haga clic en Aceptar.

Finalmente, ya estamos preparados para ejecutar el cliente y probar los servicios. Presione F5 para iniciar el cliente y el host de la consola, y haga clic en los botones. Si todo el proceso se llevó a cabo correctamente, deberá obtener los resultados siguientes (bajo el supuesto que usó los valores que se mostraban en la captura de pantalla anterior).

Fuente: http://msdn2.microsoft.com/

Escrito Por Rob Windsor, MVP de Visual Basic, de ObjectSharp Consulting.

 

Dejar una respuesta

Su respuesta:

Categorías