Introducción a Windows Communication Foundation (con alguito de WPF)El típico "Hello World", pero ahora con WinFX
Fecha: 31/May/2006 (31 de Mayo del 2006)
|
Pues bueno amigos, en esta ocasión vamos a hablar un poquito de la nueva plataforma de desarrollo que presenta Microsoft, dirigida a Windows Vista, pero que también puede utilizarse en versiones anteriores de Windows. Pues eso, que la nueva API de Windows se llama WinFX y es un metaconjunto de Win32 y el .NET Framework, lo que quiere decir que si bien Win32 está aún presente en Windows Vista, no dará toda la funcionalidad que presenta WinFX, pues ésta está especialmente orientada a los desarrolladores .NET (aunque por supuesto pueden ser consumidas desde clientes COM). WinFX se compone de cuatro tecnologías base que son pilares, a saber:
Windows Communication Foundation - WCF (antes INDIGO), que establece un modelo de programación unificado para la programación de sistemas distribuidos, orientado a servicios.
Windows Presentation Foundation - WPF (antes AVALON), que es el nuevo modelo de programación de interfases de usuario basadas en XML, lo que da lugar al XAML, que utiliza tecnologías 3D (Direct3D)(Además hará que el paso de una interfaz web a windows se base en el cambio de unos cuantos parámetros).
Windows Workflow Foundation WWF, permite la automatización de tareas, actividades y procesos (manejo de estado, flexibilidad) permitiendo utilizar transacciones integradas utilizando workflows (flujos de trabajo), además aprovecha las capacidades de BizTalk Server.
InfoCard, CodeName para una tecnología que permite el almacenamiento y manejo de identidades digitales a través de una interfaz de programación unificada que facilitará la selección de identidades para determinadas transacciones, como acceso a páginas web, un sistema empresarial, etc.
Y bueno, para los que quieran saber más sobre estas tecnologías unificadas sobre WinFX, aquí les dejo la dirección oficial de Microsoft.
Volviendo al tema de esta colaboración, bueno vamos a hacer una pequeña aplicación de introducción a Windows Communication Foundation, ok, ok,...esto suena medio marciano..¿qué cosa es realmente todo esto de WCF?, pues bien...les contaré un poco la historia
¿.NET Remoting, Web Services o COM+?
Pues bien, hace no mucho tiempo había un desarrollador como yo que andaba de blog en blog, tratando de evaluar cuáles eran las mejores prácticas para crear aplicaciones distribuidas y conecciones remotas (ok...ya notaron que era yo?). Y es que es cierto, uno andaba viendo las interminables discusiones sobre qué deberíamos usar para una aplicación distribuida, algunos planteaban que .NET Remoting porque era más rápido, y "personalizable", ....que Web Services, otros decían que NO!, que .NET Remoting tenía la desventaja de no implementar seguridad propia, y que construirla era algo,..pues...un poquito difícil (especialmente si se tiene el proyecto con las fechas justas), y que por otro lado los Web Services sí aprovechaban la seguridad de IIS, ....bueno justo cuando iba decidiéndome otros salían a decir que los ServicedComponents (COM+ desde .NET), eran lo mejor....la verdad es que al final te quedabas con 10000 dudas..no sólo sobre el nivel de la aplicación que estabas desarrollando sino sobre "cuán a la vanguardia estaba tu aplicación" y "cuánto se ajustaba a los estándares de la industria", pues todos los días aparecían abanderados de determinada tecnología postulando que la defendida por ellos era "el futuro". Ésto, sumado al hecho de que eran tecnologías que tenían modelos de programación distintos (que el proxy, que el host, que el wsdl ....:S:S:S )....si hacías algo con .NET Remoting, pues...era muy difícil pasarlo a Web Services (aunque, claro...para eso uno "planea" bien la aplicación antes de empezar a escribir código como loco, pero que aún así...no dejaba de ser un temor "latente"). y como a nosotros los desarrolladores y arquitectos nos gusta saber de todo, pues era muy difícil meterse en la cabeza tanto paradigma de programación....!!!..ufff...ni hablemos de MSMQ....
A tiempo: Windows Communication Foundation...
La cosa iba de mal en peor cuando vi, por primera vez hace ya un par de años, los anticipos de una tecnología denominada en ese entonces "Indigo", que prometía unificar en un solo paradigma de programación y bueno ahora ya está disponible: Windos Communication Foundation.
Durante una charla que di para los Developer Days 2006 en Perú hace un par de semanas (junto con Edgar Sánchez, RD de Microsoft de Ecuador, gran tipo por cierto), demostré con algunas demos la potencia de las aplicaciones desarrolladas con esta nueva tecnología, pues integra por fin a las antiguas competidoras: ServicedComponents (COM+), .NET Remoting, y Web Services, permitiendo tanto seguridad como interoperatividad e integración con esquemas existentes (COM+, MSMQ) y definitivamente una manera bien definida de programar¿Cómo? ¿Magia???..pues no y para esto, una explicación..
En primer lugar, un servicio WCF es un programa que expone una colección de Endpoints (puntos de acceso, digamos). Cada Endpoint, representado por la clase ServiceEndpoint) es una puerta hacia el programa, que se utilizará de acuerdo al tipo de comunicación que haya con el programa. Para comprender mejor esto de Endpoint, veamos el ABC del Endpoint, todo Endpoint tiene:
una Dirección (Address),
un Enlace (Binding)
y un Contrato (Contract)
La dirección del endpoint indica "dónde está" el Endpoint y está representada por la clase EndpointAddress
El enlace indica cómo se comunica el Endpoint con el mundo, e indica cosas como el protocolo de transporte (TCP, HTTP, por ejemplo....-ahh..!..ya te vas dando cuenta de a qué se parece esto?..), la codificación (encoding), por ejemplo: text, binary, y los requerimientos de seguridad (SSL, SOAP,..) Está representado por la clase Binding
Finalmente, el contrato (contract), indica QUÉ COMUNICA el Endpoint y es (como dice la propia Microsoft), una colección de mensajes organizados en operaciones que cumplen con los Patrones de Intercambio de Mensajes (Message Exchange Patterns - MEPs), como one-way, duplex, request-reply. Se representa por la clase ContractDescription. Ok, esto es muy teórico, la cosa es que este contrato se crea, generalmente, en base a una clase (que es lo que finalmente programamos con el VS.NET), a la que se le agrega el atributo ServiceContractAttibute, y a cuyos métodos (aquellos que queremos sean parte del contrato y por ende expuestos al mundo), se marcan con OperationContractAttribute (te recuerda a algo como WebServices?),
Entonces, a grandes rasgos, ya sabemos el DONDE, el CÓMO y el QUÉ...listos para empezar a usar WCF,..pero cómo funciona entonces?...bueeeno...(y espero no se me mareen), WCF utiliza mensajes SOAP para comunicar procesos (cliente y servidor), y lo interesante está en que ....cuando un proceso WCF se comunica con un proceso que no es WCF, se utiliza la codificación XML para los mensajes SOAP, sin embargo cuando se comunica con otro proceso WCF, se optimiza la comunicación aplicando codificación en formato binario para los mensajes SOAP, es decir ,....con los endpoints,...al servicio ...o mejor dicho "al desarrollador" ya no le importará mucho si lo están llamando con técnicas de .NET Remoting, WebServices o incluso COM+, pues dependiendo de cómo tenga que comunicarse se utilizará el Endpoint definido para tal propósito, se programará una sola vez y listo. De este modo un cliente puede comunicarse con un servicio WCF usando cualquier mecanismo basado en RPC (invocar al servicio haciendo llamadas a métodos). Me recuerda bastante a la capacidad de ASP.NET/IIS...aquella de dar "HTML" de acuerdo a tu browser.
Pero bueno, ya sé que tampoco es una vista tan profunda del tema, pero espero que les haya ayudado a introducirse en esta nueva tecnología, nosotros vamos a nuestro "hola mundo"....
Estoy utilizando Windows XP Home (para hacerlo más entretenido...) con Microsoft Visual Studio 2005, con el Windows SDK y Cider (para VS.NET 2005, Orcas Development Tools)
Antes que nada, definimos nuestro Servicio WCF, para ésto necesitarás una referencia al ensamblado System.ServiceModel, que contiene las definiciones de clases necesarias para crear servicios sobre WCF, éste ensamblado viene incluido en el Windows SDK. Luego (obviamente no basta con referencia un ensamblado) tendrás que utilizar una directiva using hacia el espacio de nombres necesario, en este caso: System.ServiceModel
Como vemos he llamado a mi servicio "HelloWorldService" y a mi operación (sólo he puesto y expuesto al mundo una), "SayHello"
A continuación, defino el programa que hará que mi "servicio" esté "arriba", como les dije estoy desarrollando en una notebook con Windows XP Home, por lo que no tengo Internet Information Services, de ningún tipo,...recuerden esto porque luego veremos algo "interesante" que hace WCF...
Lo que estoy haciendo es definir una URI, que será la DIRECCIÓN (Address) del Servicio WCF, para luego agregarle el punto de acceso (Endpoint), en base a un enlace (BINDING) del tipo BasicHttpBinding, y a la URI definida anteriormente. El Endpoint se define en base a la URI y especialmente en base al tipo de binding que se le indique.
Ahora bien, corramos nuestro Servicio WCF
Como vemos nuestro servicio WCF está ya "escuchando" a través del Endpoint que le hemos definido y algo más interesante aún, que la misma plataforma WCF ha levantado toda la infraestructura necesaria para publicar el Servicio en la dirección que le indiqué en el URI que definí, si vamos a la dirección vemos que nos muestra una página con una pequeña explicación de lo que se requiere para consumir el servicio...sencillo?...por ahora sí, no?
Pues bien, ahora debemos configurar al cliente, para que pueda "enviar mensajes" al servicio, y recibir la respuesta,...ya conocida.."hello world".
Y bien, para hacer esto más interesante voy a crear una interfaz de usuario con Windows Presentation Foundation (XAML), lo que pueden hacer instalando las herramientas de desarrollo de VS.NET "ORCAS" para VS.NET 2005 y claro, el Windows SDK (arriba están los links)...ahh!..una cosa,..no esperen, si están desarrollando en vista,...que el diseñador funcione, porque como es Beta aún...pues..no hay soporte para 64-bits,...cosas que pasan....(igual..la primera vez que hice la demo, la hice a puro XAML..:S..hehe..)...en fin...deberás crear un proyecto de tipo Windows (WinFX), o sino agregar referencias a todos los ensamblados necesarios (PresentationCore, PresentationFramework, WindowsBase,...y otros..mm..mejor por ahora....crea un proyecto tipo Windows (WinFX)..
Sé que puede parecer raro para algunos, prometo tocar el tema de Windows Presentation Foundation en otro envío pronto, por el momento "créanme" (¿qué difícil no?), y disfruten del nuevo paradigma de programación de IU de Windows, como páginas ASP.NET, código implementado en un lado, definición en otro (terminó la lucha con el diseñadr...grrrrr!!)...
Así se verá mi interfaz de usuario
Y el código de declaración, en XAML es este (qué emoción!!:P):
Como ven, todo descrito en XML,.....super no?....el diseñador puede definir la interfaz del usuario y por otro lado el programador definir el comportamiento...he aquí el Code-Beside...vean que el evento Click del botón apunta al método ViewMessage, que programaremos en Window1.xaml.cs, he aquí el código:
Lo que hacemos es crear un objeto del tipo HelloWorldServiceProxy...ok, ok!..ya sé..estarán pensando.."en qué me perdí???"..si no era que se llamaba "HelloWorldService"???....pues bien...he aquí la explicación...recordemos que para comunicarnos con objetos remotos, es decir que residen en otros ordenadores, debemos utilizar no al objeto en sí, sino una interfaz.....algo que nos exponga "localmente" los métodos del objeto que reside en el ordenador remoto....mmm..mejor dicho..."EL PROXY"...sí sí!..ese mismo!..pero..ahora las caras tristes...¿cómo creo el proxy..???..pues no teman..que hasta en eso se pensó, lo que se tiene que hacer es, una vez levantado el servicio WCF, ejecutar la herramienta svcutil.exe
Claro que esto lo tienen que hacer con la consola que les brinda el SDK de Windows Vista (o sino ir a buscar el archivo svcutil.exe, como les plazca)....dicha herramienta generará un archivo output.cs y output.confing, en la ruta que ven en la misma ventana, todo lo que tienen que hacer es copiar el archivo a su proyecto (o arrastrarlo), renombrar preferiblemente a output.config como app.config, y listo,...ya tienen la clase HelloWorldServiceProxy, lo que hace la herramienta es generar en base al Servicio y a su Contrato, la implementación del proxy en el archivo output.cs (que puede tener otro nombre, si se ponen a jugar con los parámetros de la herramienta :P)..y la configuración necesaria para el cliente en el archivo .config (que contiene la definición del Endpoint por el lado del cliente, del Endpoint al cual se comunicará el cliente en el Servidor).
.
Finalmente, podemos ver correr a nuestro cliente,
Eccolaaa!...quest'è lo che mi piacce fareee!:P hehe.....
Espero que esta contribución y demo no hayan sido ni muy complejas, pero tampoco taaan simples, he tratado de explicarles (a grandes rasgos, lo sé), el funcionamiento de WCF, y bueno esperen que pronto les contaré sobre Windows Presentation Foundation, si tienen alguna consulta simplemente se comunican conmigo,..pero ojo...sólo para contratos..jaja..mentiiiraa...pero eso sí!..si me escriben o me agregan al MSN Messenger, por favor "háblenme" y díganme que me conocieron por aquí..que luego tengo a 100000 que no sé ni quienes son y que jamás me hablan...se los agradezco....ahora sí...a dormir..son las 5am....:-|...wow..
è il mio piaccere avere fatto questo per voi, spero che lo gradiate,....ci vediamo a dopo...ok?...ciauuuu!!!..:P
Javier David Carrillo Atanacio
Espacios de nombres usados en el código de este artículo:
System.ServiceModel
System.Windows
System..Windows.Controls
Fichero con el código de ejemplo: JavierCarrillo_HelloWorldWCF_WPF_MSA.zip - 54.70 KB
(MD5 checksum: [074FE960ABB417458B343B0050DC6950])