Aunque es un tema que parece nuevo, la Virtualización tiene muchos años, quizás décadas, de estudios para ser lo que es ahora.

Pero, en realidad que es? Para qué sirve?

Cuando nos referimos a Virtualización hacemos referencia a agrupar los recursos informáticos en equipos virtuales de forma que los usuarios no aprecien la naturaleza física y los limites de dichos recursos. De forma resumida, la Virtualización es la anulación de la dependencia del software con respecto al hardware.

Para tener una idea de lo que es Virtualización debemos conocer algunos procesos, entre ellos tenemos Virtualización mediante hipervisor o en otras palabras Monitor de equipo virtual. Aquí la Virtualización de los equipos se consigue mediante una capa de software denominada “monitor del equipo virtual” que se sitúa entre el sistema operativo y el hardware. Dicha capa proporciona acceso a los recursos de hardware y permite ejecutar varios sistemas operativos distintos en una sola maquina o servidor (host).

Actualmente dos tipos de Virtualización han sacudido los entornos de datos, hasta ganarse el respeto en el tema.

  • El primero de ellos es conocido como Virtualización total, donde el hardware o el software (o una combinación de ambos) simulan una plataforma completa con el fin de permitir la ejecución de un sistema operativo sin modificaciones. Usando este método no es necesario personalizar el sistema operativo invitado. Sin embargo, como el sistema operativo se ha diseñado para su funcionamiento en hardware físico, éste no detecta el monitor del equipo virtual, ya sea en forma de hipervisor o de solución de host. Como resultado, el equipo virtual no podrá colaborar con otros para compartir recursos y mejorar el rendimiento.

 

  • El segundo Paravirtualización, al contrario de lo que ocurre con la virtualización total, en este se simula el hardware sólo de forma parcial. Este término hace referencia a las modificaciones realizadas en un sistema operativo con el fin de mejorar el rendimiento en entornos virtuales. El hipervisor colabora con las API que permiten abstraer los recursos de hardware del equipo virtual. Para que la paravirtualización funcione es preciso modificar las partes del sistema operativo invitado que dependan del hardware de modo que éstas detecten la capa de virtualización. El hipervisor evita las instrucciones del procesador difíciles de llevar a cabo en un entorno virtual y las sustituye por una llamada de procedimiento que proporciona esa función. De este modo, los equipos paravirtuales suelen rendir mejor que los equipos con virtualización total. La paravirtualización está ganando cada vez mayor popularidad debido a que se obtiene un mejor rendimiento con los chips existentes. Además, ofrece grandes ventajas en combinación con la última generación de chips x86 compatibles con la virtualización como los dispositivos Intel* VT y AMD-V. Asimismo, permite compartir la memoria conjunta entre equipos sin modificar el sistema operativo host.

 

El tema de Virtualización es un poco difícil y profundo pero no es imposible de entender, lo digo por experiencia, ya que escuche por primera vez de esto hace algunos meses y desde entonces he leído mucho de él pero claro está que no soy ningún especialista.

 

Bueno entonces sigamos,

 

La Virtualización en opinión personal es muy importante hoy debido a la gran variedad de sistemas operativos (SO) que existen tanto de Software Propietario como de Software Libre, y existe la posibilidad de probar varios de ellos por decirlo de algún modo, al mismo tiempo, además de este punto la forma en que se pueden reducir los costos en las empresas también da un punto a favor para la utilización del mismo.

 

Cuando probé por primera vez lo que era en realidad virtualizar, lo hice en una máquina no tan potente y logre correr sobre Windows Vista Ultimate 3 maquinas virtuales gracias a las bondades de Virtual PC 2007, entre ellas estaba Windows XP Professional Service Pack 2, Ubuntu 7.10 y Windows Server 2008. La experiencia fue muy buena ya que puedes interactuar con no solo un SO sino con tres, puedes compartir el hardware utilizando quizás la unidad de CD, un puerto USB, etc.

 

A pesar de que solo he hecho utilización de la virtualización para pruebas sencillas de Sistemas Operativos, una de las muchas utilidades que tiene la virtualización es usarla en la parte de servidores.

 

 

Algunos de Los beneficios de la virtualización que pueden experimentar los clientes por su implementación:

 

 

Aumentar la utilización de los servidores. Al facilitar la consolidación de las aplicaciones y los servidores físicos, la virtualización permite utilizar los recursos de hardware de forma más eficaz y, por tanto, reducir los costos inmobiliarios, de electricidad, mantenimiento y hardware.

 

Aumentar la continuidad empresarial y el tiempo de actividad del sistema. Los clientes pueden reducir los riesgos que entrañan los períodos de inactividad imprevistos mediante la migración de cargas de trabajo heterogéneas a equipos virtuales y la consiguiente migración de estos sistemas virtuales a equipos físicos distintos.

 

Aprovechar el exceso de capacidad del centro de datos y mejorar los tiempos de respuesta. Al equilibrar las cargas informáticas en los recursos de los centros de datos durante las horas de mayor actividad, el funcionamiento de los equipos resultará más eficaz y rentable.

 

Redistribuir los recursos de servidores físicos. Gracias a la virtualización, los clientes podrán migrar cargas de trabajo de servidores a redes virtuales y liberar recursos físicos que se pueden quitar o redistribuir para otros usos.

 

Ofrecer portabilidad y flexibilidad de aplicaciones a las plataformas de hardware. Las aplicaciones se pueden ejecutar en cualquier hardware capaz de adoptar la abstracción propia de la virtualización.

 

Mejorar la productividad en tareas administrativas y la capacidad de respuesta. La virtualización permite que las empresas de TI mejoren la productividad en tareas administrativas e implanten nuevos servidores de forma rápida y sistemática con el fin de adaptarse a las cambiantes necesidades empresariales.

 

En el centro de datos, la virtualización es una tendencia en alza ya que las nuevas tecnologías cuentan con el potencial necesario para solucionar los problemas relacionados con la eficacia, la capacidad de ampliación, la facilidad de administración y el aprovechamiento de los recursos. Provistos de equipos virtuales, los administradores de los centros de datos pueden crear nuevos niveles de flexibilidad y agilidad en sus entornos con un costo total de la propiedad menor.

 

La virtualización puede mejorar el aprovechamiento de los recursos en servidores individuales y, de este modo, economizar aún más esas inversiones. Además, permite la integración de sistemas distribuidos, gracias a que un conjunto heterogéneo de servidores de cálculo y almacenamiento se transformaría en una auténtica plataforma informática empresarial.

 

Mi recomendación hoy es implementar la virtualización, háganlo solo por pruebas con dos o tres sistemas operativos, además recomiendo que si tienes Windows® instales en tu máquina Microsoft® Virtual PC 2007 que es la herramienta que nos permite virtualizar localmente los sistemas que queramos, incluso cabe destacar que dicha herramienta es gratuita desde la página de Microsoft®.

Microsoft anunció que el Service Pack 1 (SP1) del Windows Vista, a lanzarse durante el primer trimestre de 2008, frenará los dos métodos más utilizados por los piratas informáticos para hacer copias ilegales del sistema operativo.

En primer lugar, corregirá una vulnerabilidad vinculada al BIOS de la motherboard, que permite a los piratas simular el proceso de activación que utilizan algunos fabricantes de computadoras para instalar Vista en las computadoras que comercializan.

En segundo lugar, añadirán medidas para impedir las técnicas aplicadas a extender, de manera ilimitada, el “periodo de gracia” que otorga la compañía entre la instalación y la activación del Vista.

Microsoft también cambiará la forma de tratar las versiones pirateadas del nuevo Windows. En la actualidad, cuando se detecta una copia ilegal o no se lo activa a tiempo, el sistema operativo queda limitado en funciones.

Con el SP1, los usuarios recibirán ahora notificaciones periódicas de que su versión del software es fraudulenta, con un enlace para comprar una copia auténtica.

Según el grupo empresarial Business Software Alliance, en torno al 35 por ciento del software para usuarios del mundo está pirateado. Windows, presente en más del 90 por ciento de las computadoras del mundo, es el producto que más se copia ilegalmente.

Al finalizar septiembre, la empresa había vendido 88 millones de licencias de Vista. Las mejoras para reducir la piratería implementadas en el sistema operativo lograron incrementar en un 25 por ciento las ventas de Windows durante el tercer trimestre del año.

Venezuela y su mencionado cambio de Horario!!!!! 

El 9 de diciembre a las tres de la madrugada se implementará de manera oficial la nueva hora legal en Venezuela, la cual se aplicará retrasando los relojes media hora.

Donatella Pizzi de Machado, corredactora de la Ley de Metrología Explicó que el meridiano escogido es más céntrico al país. “Esas decisiones hay que tomarlas en su globalidad porque vivimos en un país con conexiones internacionales; entonces no es solamente la posición que tiene, sino lo que implica lo que es un sistema horario internacional, en el cual se procura tener horas enteras para el mejor manejo de las horas bajo todo aspecto de vista, comunicacional, comercial y económico”.

Indicó que a su vez salimos de la alineación que teníamos con cinco países “lo cual nos conviene comercialmente hablando del continente”. Destacó que en la Gaceta Oficial ya está establecido el Meridiano 67º 30’, el cual es el mismo que tenía Venezuela en 1912.

Manifestó que desde que se elaboró la propuesta, hasta el momento en que se va a implementar ha habido una serie que restricciones y de cambios convenientes; sin embargo considera que “son demasiados cambios para los efectos reales que va a tener esta medida, demasiados ajustes a líneas aéreas, ajuste de maquinarias, entre otros cambios”.

Por otra parte el ministro del Poder Popular para Ciencia y Tecnología, Héctor Navarro. Su señalamiento lo hizo este viernes al ser entrevistado en Venevisión. Explicó que se trata de una medida que tiene que ver con la salud pública, ‘por lo que todos tenemos que tener un mínimo de racionalidad al respecto y acatarla”. Este domingo 9/12, a las 3:00 de la mañana, con motivo del cambio de la hora legal de Venezuela los relojes deberán retrasarse media hora. No obstante, Navarro señaló que no es necesario que los venezolanos se levanten a esa hora para retrasar el reloj, con que lo hagan al levantarse el domingo es suficiente. Hizo la salvedad de que quienes sí deben hacerlo a esa hora son los que llevan la hora legal de Venezuela en el Observatorio Cagigal, porque tienen una responsabilidad internacional, así como los que tienen que ver con los prestadores de servicios de telefonía.

 Asi que no se preocupen por retrasar sus relojes el domingo en la madrugada, cuando despierten en la mañana o al mediodia o incluso en la noche (ya que hay personas que duermen todo el dia) pueden hacerlo. Recuerden quitenle 30 minutos y listo!

Ultimamente se ha venido escuchando en nuestro país algo de un cambio de horario parece ser que se le restara 30 minutos a la hora normal, según esto empezaria a partir del 1 de octubre pero tambien escuche a un amigo diciendo que ya ese cambio no se realizara.

Bien sea o no el caso ya que no es mi objetivo hablar de si el Gobierno cambia o no, El Presidente lo anunció y lo que se queria hacer era un cambio a la zona horaria para el país el cual hasta fecha normalmente que habia observado Hora estándar de Occidental de Sudamérica. Según informes oficiales, aún hay una fecha de comienzo de zona horaria nueva para determinarse pero proyectarse para producir antes de 31 de diciembre de 2007.

Debido a ese alboroto, Microsoft publicó una actualización para el sistema operativo Windows (Windows XP, Windows Server 2003 y Windows Vista) que ya está disponible para permitir que pruebe y que implemente la zona horaria nueva para Caracas, Venezuela antes de un anuncio oficial de la fecha de moverse a la zona horaria nueva a clientes y socios.
Al mover a sus clientes Windows a la zona horaria nueva, se moverán relojes de atrás 30 minutos de UTC –4 : 00 a UTC –4 : 30. Este cambio se comienza en hora local 11:59:59 p.m. en la fecha de comienzo. Los relojes deberían estar movidos de nuevo a 11:30:00 p.m. en vez de que debido avanzar a 12 :00:00 AM (medianoche).

Microsoft recomienda que los clientes que actualizan manualmente su información de zona horaria utilizando esta actualización mantengan sus configuraciones de zona horaria actual y que confirmen la fecha de comienzo del cambio de zona horaria en el República de Venezuela Bolivariana antes de utilizar la zona horaria nueva.

Usuarios finales pueden realizar esta actualización. La zona horaria nueva resultante puede permanecer en la ficha de zona horaria puede tener un nombre para mostrar de la Paz (GMT-04:00) hasta que el usuario haga una transición a Hora estándar de Venezuela manualmente. También esta zona horaria es Hora estándar de Occidental suramericana.

Utilizar esta zona horaria nueva antes que el cambio de zona horaria oficial afecte a la fecha y al tiempo en su equipo.

Bueno en realidad no estoy seguro si en realidad cancelaron el cambio de horario pero ya Microsoft se adelanto a esa desición y ya tenemos una zona horaria para Venezuela.

Fuente: http://support.microsoft.com/kb/938977

.NET Framework

La API principal contiene clases compartidas por todos los tipos de aplicaciones de .NET Framework 3.0.

Forman parte en gran medida del espacio de nombres System, así como de los descendientes tal como System.Collections. Las API de .NET Framework incluyen compatibilidad con:

Tipos de referencia y valor básico, como INT 32, String y URI

Colecciones y Estructuras de Datos
Data
Graficos y Dibujos
Entrada/salida
Redes básicas
Seguridad
Servicios de tiempo de ejecución y subprocesamiento

.NET Framework también proporciona compatibilidad para crear aplicaciones Web y para Windows.

ASP.NET es una plataforma Web unificada que proporciona todos los servicios necesarios para generar aplicaciones Web de clase empresarial. Las clases que constituyen la API forman parte en gran medida del espacio de nombres System.Web o sus descendientes.

Windows Forms es una plataforma para desarrollar aplicaciones de cliente Windows. Una aplicación de Windows Forms también puede actuar como interfaz de usuario local en una solución distribuida de varios niveles. Windows Forms amplía la API principal con un claro conjunto orientado a objetos extensible de clases que permiten desarrollar aplicaciones avanzadas de cliente Windows. Las clases que constituyen la API forman parte en gran medida del espacio de nombres System.Windows.Forms o sus descendientes.

Microsoft® Windows® Communication Foundation

Windows Communication Foundation es la nueva infraestructura de comunicación orientada a servicios creada sobre la base de protocolos de servicios Web. La compatibilidad del servicio Web avanzado en Windows Communication Foundation proporciona una mensajería interoperable, segura, confiable y por transacciones.El modelo de programación orientado a servicios de Windows Communication Foundation se basa en .NET Framework y simplifica radicalmente el desarrollo de sistemas conectados. Unifica una amplia gama de capacidades de sistemas distribuidos en una arquitectura extensible que se puede componer y que admite varios transportes, patrones de mensajería, codificaciones, topologías de red y modelos de hospedaje. Es la nueva versión de varios productos existentes: Los métodos Web de ASP.NET (“ASMX”) y Microsoft Web Services Enhancements para Microsoft .NET (WSE), .NET Remoting, Enterprise Services y System.Messaging.

Las clases que constituyen la API de Windows Communication Foundation forman parte en gran medida del espacio de nombres System.ServiceModel y sus subespacios de nombres. Windows Communication Foundation admite una gran variedad de escenarios, que incluyen:

Mensajería unidireccional y dúplex
Llamadas a procedimientos remotos síncronas y asíncronas
Devoluciones de llamadas
Sesiones
Servicios de varios contratos
Seguridad basada en transporte y mensajes, confiabilidad y entrega ordenada
Mensajes en cola
Compatibilidad con transacciones

Microsoft® Windows® Presentation Foundation

Windows Presentation Foundation es un subsistema de presentaciones unificado de Microsoft para Windows. Consta de un motor de visualización y un conjunto de clases administradas que permite crear aplicaciones avanzadas y sensacionales visualmente. Windows Presentation Foundation también introduce XAML, que permite utilizar un modelo basado en XML para manipular mediante declaración el modelo de objetos de Windows Presentation Foundation.

Las clases que constituyen la API forman parte en gran medida del espacio de nombres System.Windows.Forms o sus descendientes. Los componentes principales son:

Un modelo de aplicaciòn con compatibilidad con exploración, ventanas y cuadros de diálogo
Enlace de datos de IU
Un avanzado conjunto de objetos de diseño y de control extensibles
Gráficos bidimensionales y tridimensionales
Animaciones
Multimedia
Documentos

Microsoft® Windows® Workflow Foundation

Windows Workflow Foundation es una nueva plataforma de desarrollo de flujo de trabajo basada en .NET Framework.

Windows Workflow Foundation proporciona un modelo de programación para desarrollar y ejecutar una amplia variedad de aplicaciones de flujo de trabajo persistentes, con estado y de larga duración.

Windows Workflow Foundation proporciona una funcionalidad de flujo de trabajo de fábrica para desarrollar fácilmente aplicaciones basadas en flujo de trabajo como, por ejemplo, administración de documentos, flujo de páginas comerciales, administración de IT y distintas aplicaciones de línea de negocios.

Las aplicaciones pueden cargar el motor de flujo de trabajo y conectar una gran variedad de componentes del servicio de tiempo de ejecución. Windows Workflow Foundation es muy extensible, por lo que puede crear sus propios componentes personalizados para tratar preocupaciones empresariales concretas.

Windows Workflow Foundation también ofrece compatibilidad con ASP.NET para facilitar la creación y ejecución de flujos de trabajo que se ejecutan en el entorno de Internet Information Services (IIS)/ASP.NET.

Nota: El SDK de Windows®, que incluye contenido para Microsoft® .NET Framework 3.0, proporciona un conjunto de interfaces de programación de aplicaciones (API) administradas, documentación, muestras y herramientas que permiten crear una gran variedad de aplicaciones para Windows. En un nivel superior, .NET Framework 3.0 consta de estos componentes básicos.

Fuente: http://www.microsoft.com/spanish/msdn/articulos/

Gracias a la disponibilidad de Windows Workflow Foundation (WF), Microsoft está introduciendo funciones de flujo de trabajo en la plataforma de desarrollador de .NET. Estas capacidades permiten que los desarrolladores creen flujos de trabajo que se ajusten a un amplio número de situaciones, desde sencillos flujos de trabajo secuenciales hasta complejos flujos de trabajo basados en equipos con sofisticadas interacciones humanas. Al mismo tiempo, se está imponiendo una tendencia que promueve la exposición de las funciones empresariales a través de extremos de servicio encapsulados, que permiten reutilizar y componer las funciones y los procesos empresariales, lo que provoca el ascenso de las arquitecturas orientadas a servicios. Windows Communication Foundation (WCF) está disponible ya para proporcionar a los desarrolladores funciones que permitan desarrollar sistemas conectados de forma sencilla, mediante una API de desarrollador consistente, un tiempo de ejecución de alojamiento sólido y una solución flexible controlada por configuración para asistir en la implementación.

Muestra de informes de gastos

La muestra de código de este artículo está basada en la muestra del flujo de trabajo de informes de gastos que funciona como modelo del proceso empresarial estándar relacionado con el envío y la aprobación de una reclamación de gastos por parte del empleado. La muestra original se ha actualizado para demostrar cómo se puede aprovechar de WCF y .NET 3.0 Framework para alojar este supuesto de forma más eficaz.

Cuando se publicó la primera muestra de informes de gastos, se utilizó .NET Remoting para ofrecer comunicación entre las aplicaciones cliente y la aplicación host que contenía la instancia de tiempo de ejecución del flujo de trabajo.

Hemos refactorizado la implementación de los informes de gastos para realizar la comunicación entre clientes y servicio mediante WCF. La solución también se ha estructurado lógicamente para apartar las distintas preocupaciones dentro de ésta.

Figura 1. Estructura de nuestra solución refactorizada

Es importante entender cómo se utilizan los mensajes dentro del contexto del proceso empresarial, de forma que pueda incorporarlos a su diseño. En el ciclo de vida de los informes de gastos, existen varios puntos de interacción. Revisémoslos brevemente:

Existen tres partes en el proceso: Un cliente, un director y el sistema de host de los informes de gastos.
El proceso se inicia cuando un cliente envía una nueva reclamación de gastos.
Utilizamos una directiva de reglas para determinar si la reclamación de gastos se puede aprobar automáticamente.
Si la reclamación de gastos no se ha aprobado automáticamente, necesitamos un director para que apruebe el informe. El director tiene que comprobar la aprobación de un informe nuevo o recibir una notificación al respecto.
Si el director no lo aprueba dentro de un margen de demora flexible, el proceso rechazará automáticamente la reclamación.
Después de revisar una reclamación, el cliente y el director se deben actualizar en función del resultado.

Mediante WF, podemos modelar este proceso a través de las actividades estándar que se ofrecen con el marco. Podemos utilizar DelayActivity para administrar un desencadenamiento de eventos después de que haya transcurrido un período de tiempo y podemos utilizar el motor de reglas y PolicyActivity para administrar un conjunto flexible de reglas que se interroguen en busca de un resultado.

Dado que se trata de un proceso orientado al usuario, debemos interactuar con los usuarios finales y volver a desencadenar la interacción en el flujo de trabajo. WF ofrece un modelo de programación completo que permite la comunicación entre un host y un flujo de trabajo a través de los servicios locales, HandleExternalEventActivity y CallExternalMethodActivity.

Dado que esto supone un concepto importante en la creación de flujos de trabajo interactivos, analicemos rápidamente cómo se ha diseñado esto en WF.

Para modelar interacciones en WF, debemos diseñar un contrato que exponga un número de eventos y métodos. Tanto el proceso de host como el de flujo de trabajo comprenderán este contrato. El contrato/La interfaz que hemos creado se deben marcar con el atributo [ExternalDataExchange()], que los identifica como diseñados para el intercambio de datos de flujo de trabajo. En nuestra muestra, utilizamos la interfaz IExpenseLocalService con nuestro flujo de trabajo.

A continuación, suscribimos una clase (conocida como Servicio local) que implementa dicha interfaz con el tiempo de ejecución del flujo de trabajo. Las actividades de flujo de trabajo pueden registrarse para eventos o consumir métodos definidos en el tipo de interfaz, y se transmitirán al servicio local que hemos registrado. Esto utiliza un patrón denominado Inversión de control que elimina el estrecho acoplamiento entre el flujo de trabajo y el tipo concreto de servicio local. En nuestro ejemplo, la clase ExpenseLocalService implementa nuestro contrato IExpenseLocalService.

Si el flujo de trabajo se ejecuta primero, se puede ofrecer una bolsa inicial de datos en la que trabajar. Después de que el flujo de trabajo alcance un punto en el que necesite interacción externa, podemos desencadenar un evento que se pueda enlazar a HandleExternalEventActivity en el flujo de trabajo. Esta actividad toma el tipo de interfaz y el evento como argumentos. El flujo de trabajo se activará cuando se desencadene el evento, lo que permite que continúe la ejecución.

Si el flujo de trabajo debe volver a llamar a un servicio local, puede hacerlo mediante CallExternalMethodActivity y proporcionando la interfaz y el nombre de método como argumentos.

Gracias a estas actividades, podemos establecer una comunicación bidireccional dentro del proceso de host con un flujo de trabajo en ejecución y, a través del uso de la Inversión de control dentro de WF, se le protege del estrecho acoplamiento entre los flujos de trabajo y los servicios locales.

Sin embargo, y aunque son más extensas que el proceso de host, debemos permitir interacciones controladas por otros sistemas o incluso por otros usuarios. Podemos lograr este nivel de interacción distribuyendo nuestras operaciones interactivas a través de servicios a los que pueden, a su vez, llamar otros servicios o aplicaciones controladas por usuario. WCF es el marco en el que podemos crear esta función de mensajería de una manera flexible.

Las ventajas clave de nuestro supuesto de integración con WCF son las siguientes:

Podemos desacoplar nuestra implementación de servicio a partir del código de instalación de mensajería.
Hay mucho menos código y menos complejidad a la hora de conectar nuestros sistemas.
Tenemos flexibilidad de implementación.
Podemos utilizar las devoluciones de llamada directas desde el host a los clientes, para ofrecer actualizaciones de información más rápidas y con menos sobrecarga.

Lista de comprobación de integración

Para completar una integración de WF y WCF, debemos exponer una interfaz de servicio que ofrezca varios puntos de interfaz a los consumidores, donde puedan iniciar o interactuar con un flujo de trabajo en ejecución. El servicio se debe modelar en torno a los puntos en los que el proceso empresarial interactúa con entidades externas, como usuarios implicados en el proceso.

Figura 2. Puntos de interacción en el supuesto de informes de gastos

Para lograr esto, debemos:

Definir contratos de servicio.
Implemente operaciones de servicio que creen nuevos flujos de trabajo (o interactúen con flujos de trabajo existentes) a través de eventos.
Aloje una instancia de tiempo de ejecución del flujo de trabajo dentro de un host de servicios.

Además de simplemente recibir nuestro flujo de trabajo, también podemos usar los canales dúplex de WCF para desencadenar eventos fuera del flujo de trabajo y devolverlos a los clientes de consumo. En el caso de los informes de gastos, esto supone una ventaja, ya que la solución depende de que los clientes sondeen el servicio en busca de actualizaciones de datos regulares. En vez de eso, pueden recibir la notificación directamente desde el servicio.

Para ello, debemos:

Definir un contrato de devolución de llamada.
Utilizar un enlace que admita un canal dúplex.

Definición de contratos de servicio

Windows Communication Foundation (WCF) requería que se declarara un contrato formal para definir de manera abstracta las funciones de un servicio y el intercambio de datos. Esto se define en código mediante la declaración de una interfaz.

Cuándo diseñe un servicio empresarial, probablemente utilizará un patrón de colaboración de solicitud y respuesta. Al utilizar este patrón, debe incluir estos tres aspectos en el contrato que se ofrece:

Las operaciones que se están publicando. Éstas son las funciones que publica el servicio para sus consumidores. Éstos son los métodos de la interfaz.
Mensajes que encapsulan los datos estructurados de cada solicitud y respuesta. Éstos son los argumentos y los tipos de valor devuelto de cada método. En la terminología de WCF, éstos son contratos de mensaje típicos o, en situaciones más sencillas, serán contratos de datos.
Las definiciones de datos de las entidades empresariales principales que se pueden intercambiar a través del servicio. Éstos forman parte de los mensajes. En la terminología de WCF, éstos serán nuestros contratos de datos.

Un contrato de servicio se define mediante el uso de un marcado basado en atributos que defina los contratos que exponen operaciones y, a continuación, las operaciones específicas que se están publicando a través de la red.

Cada contrato de servicio se marca explícitamente con el atributo [ServiceContract]. Este atributo se puede declarar con parámetros entre los que se incluyan:

Name. Controla el nombre del contrato declarado en el elemento <portType> de WSDL
Namespace. Controla el nombre del contrato declarado en el elemento <portType> de WSDL
SessionMode. Especifica si el contrato requiere un enlace que admita sesiones
CallbackContract. Especifica el contrato que se va a utilizar para las devoluciones de llamada de clientes
ProtectionLevel. Especifica si el contrato requiere un enlace que admita la propiedad ProtectionLevel, que se utiliza para declarar los requisitos de cifrado y las firmas digitales

Declaración de operaciones

Por tanto, el servicio está compuesto de un número de operaciones publicadas. Las operaciones explícitamente suscritas en el contrato que se está marcando con el atributo [OperationContract]. Al igual que ServiceContract, un OperationContract tiene varios parámetros que controlan cómo se puede enlazar con un extremo. Éstos incluyen:

Action. Controla el nombre que identifica esta operación de forma única. Cuando se reciben mensajes en un extremo, el distribuidor utiliza el control y la acción para determinar el método al que se va a llamar.
IsOneWay. Indica que la operación tomará un mensaje de solicitud, pero no genera respuesta. Esto es diferente al hecho de simplemente devolver un tipo de valor void que aún generará un mensaje de resultado.
ProtectionLevel. Especifica los requisitos de cifrado o firma que requerirá la operación.

Aquí se incluye un ejemplo del aspecto de un contrato de servicio en el código.

[ServiceContract] 
public interface IExpenseService 
{ 
        [OperationContract] 
        GetExpenseReportsResponse GetExpenseReports(); 

        [OperationContract] 
        GetExpenseReportResponse GetExpenseReport(GetExpenseReportRequest 
getExpenseReportRequest); 
}

Declaración de entidades de datos y mensajes

Probablemente deseará modelar sus mensajes como clases que definan la carga útil o el cuerpo de cada uno de los mensajes que envíe. Esto se parece a la forma en que se modelan los mensajes mediante herramientas, como WS Contract First (WSCF), al crear servicios Web con ASP.NET.

WCF utiliza de forma predeterminada un motor de serialización denominado DataContractSerializer para serializar y deserializar datos (es decir, para convertirlo a y desde XML). Usamos DataContractSerializer agregando una referencia al espacio de nombres System.Runtime.Serialization y, a continuación, marcamos nuestra clase con el atributo [DataContract] y los miembros que se van a publicar con el atributo [DataMember].

[DataContract] 
    public class GetExpenseReportsResponse 
    { 
        private List<ExpenseReport> reports; 

        [DataMember] 
        public List<ExpenseReport> Reports 
        { 
            get { return reports; } 
            set { reports = value; } 
        } 
    }

Las entidades de datos que se utilizan dentro de los mensajes representan las entidades incluidas dentro del dominio empresarial. Al igual que los contratos de mensajes, podemos usar DataContractSerializer y los atributos para suscribir explícitamente miembros que se están distribuyendo; o, si sólo vamos a modelar datos, podemos usar un enfoque de campos públicos y marcar la clase como serializable.

En la muestra, hemos utilizado el enfoque de contrato de datos para marcar la mensajería. En situaciones reales, a menudo tendrá que tratar con esquemas más complicados, el uso de atributos en los esquemas y los requisitos para utilizar encabezados de SOAP. WCF se encarga de estos casos extremos gracias a la capacidad de definición de clases marcadas con el atributo [MessageContract], que describe todo el sobre de SOAP, en vez de sólo el cuerpo.

Alojamiento del tiempo de ejecución del flujo de trabajo

Los servicios suelen tener en cuenta cualquier comportamiento simultáneo en el que se cree una instancia nueva del tipo de servicio y se mantenga durante el ciclo de vida de una sesión. Para usar el flujo de trabajo en esta situación, debemos crear una instancia de tiempo de ejecución del flujo de trabajo y mantenerla durante el ciclo de vida de la instancia de host de servicios, en vez de hacerlo por llamada.

El enfoque recomendado es utilizar una clase de extensión que se activará tras la creación del host de servicios. Esta extensión creará y mantendrá una instancia global del tiempo de ejecución del flujo de trabajo, permitiendo el acceso por cada una de las instancias de servicio independientes.

Para implementar una extensión en ServiceHost, cree una clase que implemente IExtension<ServiceHostBase.> En la solución, puede encontrar un ejemplo de esto en la clase WfWcfExtension que reside en el proyecto de código WcfExtensions.

Es necesario implementar dos métodos: Attach, que se denominará como la extensión adjunta a su objeto principal y Detach, que se denominará como el objeto principal que se está descargando.

El método Attach, que se muestra aquí, crea una instancia nueva de WorkflowRuntime y la instancia con los servicios necesarios. Almacenaremos esto en un campo privado local denominado workflowRuntime.

void IExtension<ServiceHostBase>.Attach(ServiceHostBase owner) 
{ 
   workflowRuntime = new WorkflowRuntime(workflowServicesConfig); 
   ExternalDataExchangeService exSvc = new ExternalDataExchangeService(); 
   workflowRuntime.AddService(exSvc); 
   workflowRuntime.StartRuntime(); 
}

Como puede ver, nuestra inicialización del tiempo de ejecución del flujo de trabajo implica también la adición de instancias de servicio al tiempo de ejecución, antes de iniciarlo. Al crear sus soluciones, generalmente recomendamos agregar cualquier servicio antes de iniciar el tiempo de ejecución. Sin embargo, si el acoplamiento es una preocupación, podría ser más sensato utilizar un enfoque de enlace en tiempo de ejecución.

En nuestro ejemplo, como parte del método SetUpWorkflowEnvironment de la clase ExpenseService, agregamos una instancia de ExpenseLocalService en ExternalDataExchangeService después de que se haya iniciado WorkflowRuntime.

El método Detach que se muestra aquí desconecta el tiempo de ejecución llamando a StopRuntime.

void IExtension<ServiceHostBase>.Detach(ServiceHostBase owner) 
{ 
   workflowRuntime.StopRuntime(); 
}

Dado que WorkflowRuntime se crea e inicializa como parte del inicio del host de servicios, cualquier flujo de trabajo existente podrá continuar antes de realizar las llamadas de servicio. Si termina el host de servicios termina, el tiempo de ejecución del flujo de trabajo se desconectará limpiamente.

Nota:

Recomendamos que utilice la persistencia de flujo de trabajo (por ejemplo, SqlWorkflowPersistenceService) al alojar flujos de trabajo y modelar flujos de trabajo de ejecución prolongada, que es la norma habitual. Esto le ofrecerá un mecanismo de persistencia de estado para sobrevivir a cualquier reinicio de la aplicación o de procesos.

Creación de operaciones de servicio

Para crear una clase que contenga el comportamiento de servicio, debe implementar una o más interfaces que definan un contrato de servicio.

public class ExpenseService : 
        IExpenseService, 
        IExpenseServiceClient, 
        IExpenseServiceManager

Para integrar con el flujo de trabajo, nuestros métodos de servicio no contendrán lógica empresarial, sino que en su lugar contendrán código para controlar o desencadenar eventos en un flujo de trabajo en ejecución que encapsule el proceso empresarial.

Para las operaciones que tratan con el flujo de trabajo, iniciaremos un nuevo flujo de trabajo o interactuaremos con un flujo de trabajo ya en ejecución.

La creación de una instancia de flujo de trabajo nueva requiere que utilicemos WorkflowRuntime para crear una instancia nueva del tipo de flujo de trabajo deseado. Ya hemos creado una en nuestra clase de extensión ServiceHost. Para obtener una referencia a esta instancia, debemos encontrar nuestra extensión personalizada con OperationContext.

WfWcfExtension extension = 
OperationContext.Current.Host.Extensions.Find<WfWcfExtension>(); 
workflowRuntime = extension.WorkflowRuntime;

OperationContext es una clase que nos ofrece acceso al contexto de ejecución del método de servicio. Como puede ver en el código anterior, ofrece un valor Singleton denominado Current que nos facilita el contexto del método de servicio actual. Llamamos a la propiedad Host para capturar de nuevo una instancia en el ServiceHost que se está ejecutando y, a continuación, encontramos nuestra extensión en función de su tipo.

Después de que tengamos una referencia a nuestra instancia de extensión, podemos volver a WorkflowRuntime a través de nuestra propiedad pública y utilizarla para crear una instancia nueva de nuestro SequentialWorkflow.

Guid workflowInstanceId = 
submitExpenseReportRequest.Report.ExpenseReportId; 

Assembly asm = Assembly.Load("ExpenseWorkflows"); 
Type workflowType = asm.GetType("ExpenseWorkflows.SequentialWorkflow"); 

WorkflowInstance workflowInstance = 
   workflowRuntime.CreateWorkflow(workflowType, null, workflowInstanceId); 
workflowInstance.Start(); 

expenseLocalService.RaiseExpenseReportSubmittedEvent( 
   workflowInstanceId, submitExpenseReportRequest.Report);

En el código anterior, creamos una instancia de flujo de trabajo nueva basada en un tipo predefinido. Si bien esto se podía lograr a través de la instancia de tipo directo, esto demuestra que en realidad podríamos tener flexibilidad para crear un flujo de trabajo basado en una regla dinámica en el tiempo de ejecución, en vez de hacerlo a través de un enlace con tipos más sólidos.

La última línea señala el inicio del flujo de trabajo mediante el desencadenamiento de un evento manejado por el primer HandleExternalEventActivity del flujo de trabajo. Esto se desencadena a través de una instancia de la clase ExpenseLocalService. En la muestra, ExpenseLocalService se utiliza para interactuar con el flujo de trabajo a través del inicio de nuevos flujos de trabajo o el desencadenamiento de eventos en flujos de trabajo existentes. Utilizamos esta clase como mecanismo de encapsulación de nuestro proceso empresarial. Internamente, esto se implementa con WF.

Figura 3. Nuestro flujo de trabajo se inicia con HandleExternalEventActivity.

El otro tipo de situación con la que trataremos es llamar de nuevo a un flujo de trabajo existente y desencadenar eventos. Debemos desencadenar un evento en el motor de flujo de trabajo que provoque que nuestro flujo de trabajo existente reciba el evento y continúe el procesamiento.

Un ejemplo de dónde se producirá esto dentro del flujo de informes de gastos se produce cuando se necesita al Director de aprobación. El flujo de trabajo llama al método externo para RequestManagerApproval que desencadenará una alerta para el director acerca de que deben aprobar o rechazar un nuevo informe de gastos.

El flujo de trabajo contiene ListenActivity, que se bloqueará hasta que se haya producido uno de los eventos posibles. En este caso, recibimos un evento que indica que un director ha revisado el informe o que ha transcurrido nuestro tiempo de espera en función de DelayActivity.

Figura 4. Flujo de actividad personalizado de ManagerApproval

Guid workflowInstanceId = 
submitReviewedExpenseReportRequest.Report.ExpenseReportId; 

ExpenseReportReviewedEventArgs e = 
   new ExpenseReportReviewedEventArgs(workflowInstanceId, report, review); 

if (ExpenseReportReviewed != null) 
{ 
   ExpenseReportReviewed(null, e); 
}

Cuando un director revisa un informe con ManagerApplication, se vuelve a realizar una llamada de servicio al host solicitando el método SubmitReviewedExpenseReport que desencadena el evento ExpenseReportReviewed.

Al desencadenar un evento HandleExternalEventActivity en el flujo de trabajo, debe conocer el GUID de la instancia del flujo de trabajo con que tratamos, para que el evento se pueda dirigir.

Cada evento se desencadena con EventArgs, que permite volver a transferir datos al flujo de trabajo a través del modelo de eventos. En este caso, podemos transferir detalles del estado actual del informe y los datos que nos dan contexto acerca de la actividad de revisión.

En el flujo de trabajo, los eventos se transmiten automáticamente al flujo de trabajo a través de las propiedades en HandleExternalEventActivity.

Figura 5. Estamos transmitiendo HandleExternalEventActivity a la interfaz de IExpenseLocalService.

Especifique el tipo de interfaz que se debe marcar con el atributo [ExternalDataExchange] y, a continuación, el evento de esa interfaz al que se va a suscribir HandleExternalEventActivity.

Los argumentos del evento se deben derivar desde la clase ExternalDataEventArgs. Como mínimo, esto significa que cada evento contendrá el contexto, al igual que el valor InstanceId del flujo de trabajo. El tiempo de ejecución del flujo de trabajo administra el enrutamiento del evento a la instancia de flujo de trabajo correcta con el fin de continuarlo. Si utilizamos un servicio de persistencia, el tiempo de ejecución también administrará la hidratación y la rehidratación de cualquier estado de ejecución del flujo de trabajo durante el transcurso de su ejecución.

Alojamiento del servicio

Para alojar un servicio de WCF, debemos ejecutarlo dentro del contenedor ServiceHost.

Para revisar cómo se puede lograr el alojamiento con WCF, permítanos recordar las alternativas que tenemos disponibles:

Para procesos estándar de Windows, se puede crear y abrir manualmente una instancia de ServiceHost.
Al alojar un extremo web (servicio web) a través de Microsoft Internet Information Services (IIS) 6.0, usamos un HttpHandler personalizado facilitado bajo el espacio de nombres System.ServiceModel.
Al alojar bajo IIS 7, podemos utilizar Windows Activation Service (WAS) para alojar nuestros extremos.

Generalmente, si está creando servicios web, le conviene elegir el alojamiento mediante Internet Information Services. Si está creando un extremo de instancia única que funcione como demonio, generalmente le conviene elegir el alojamiento a través de un servicio de Windows.

En nuestro ejemplo, estamos alojando la instancia de servicio principal dentro de una aplicación de consola de Windows de forma parecida a cómo se alojaría un servicio de Windows.

Para implementar un servicio, debemos crear una instancia de la clase ServiceHost y abrir sus extremos para cada tipo de servicio que queramos publicar. ServiceHost toma varios argumentos como parte de su constructor; sin embargo, el argumento principal es un argumento Type o una instancia de una clase que implementa ServiceContract.

Utilice Type cuando desee utilizar PerCall o instancias de PerSession.
Utilice una instancia única cuando utilice instancias de Single.

Después de haber establecido un host, analizará sintácticamente cualquier configuración disponible y la fusionará con cualquier configuración agregada explícitamente, con el fin de determinar los extremos disponibles y abrirlos para publicar. A medida que se reciben llamadas de clientes, las solicitudes se procesan en nuevos subprocesos de trabajo en segundo plano y se dirigen a las operaciones de servicio apropiadas, según les indica el nombre de contrato de SOAP y la acción del mensaje.

using (ServiceHost serviceHost = new ServiceHost(new ExpenseService())) 
{ 
   WfWcfExtension wfWcfExtension = 
      new WfWcfExtension("WorkflowRuntimeConfig"); 
   serviceHost.Extensions.Add(wfWcfExtension); 
   serviceHost.Open(); 

   // block the process at this point, for example Console.ReadLine(); 

   serviceHost.Close(); 
}

Al configurar ServiceHost, debe hacerlo así antes de abrir los extremos para las conexiones. Puede hacerlo así, como le hemos mostrado anteriormente, interactuando con el objeto de host antes de llamar a .Open(). Es recomendable que utilice un ámbito de uso para que ServiceHost esté dispuesto antes del uso y que llame explícitamente a Close() al final de ese ámbito para desconectar limpiamente cualquier extremo o conexión activos.

Configuración de implementación

WCF ofrece un mecanismo para separar las preocupaciones de implementación de la implementación en sí mediante la configuración de los extremos a través de la configuración XML. Esto ofrece a los administradores la capacidad de modificar la directiva de un servicio sin tener que perfeccionar el código.

Cada servicio se publica en uno o más extremos. Un extremo es simplemente un punto de conexión dirigible en el que los clientes pueden consumir el servicio. En WCF, cada extremo se declara con tres atributos que se han popularizado como los ABC de WCF.

Son Address, Binding y Contract.

Address: La ubicación dirigible única de este extremo. Generalmente, será un URI que le proporciona la dirección absoluta en la que el servicio está escuchando solicitudes; por ejemplo: http://myhost/myservice o net.tcp://myhost:400/myservice

Binding: La directiva que dicta el protocolo para la comunicación entre el servicio y sus consumidores. Binding especifica aspectos tales como el tipo del transporte que se está utilizando, la forma en que se están codificando los mensajes y la forma en que se serializan los datos. WCF incluye varios valores Binding “de fábrica” que admiten la mayoría de las situaciones comunes.

Contract: Las operaciones y los datos que se van a publicar según hayamos definido a través de una interfaz en el código.

Para configurar nuestro servicio, debemos declarar una configuración que declare nuestro servicio y configurar cualquier número de extremos para el servicio. Dado que un servicio podría implementar cualquier número de contratos, esto afectará también al número de extremos que tenga que publicar.

A continuación le mostramos una configuración de ejemplo.

<services> 
   <service name="ExpenseServices.ExpenseService"> 
      <endpoint 
         address="http://localhost:8081/ExpenseService/Manager" 
         binding="wsHttpBinding" 
         contract="ExpenseContracts.IExpenseServiceManager" /> 
<endpoint 
         address="http://localhost:8081/ExpenseService/Client" 
         binding="wsDualHttpBinding" 
         contract="ExpenseContracts.IExpenseServiceClient" /> 
   </service> 
</services>

En este ejemplo de configuración, declaramos una configuración para el servicio de tipo ExpenseServices ExpenseService. Esto permite que el tiempo de ejecución encuentre la configuración cuando creamos una instancia de un nuevo ServiceHost basado en este tipo.

Consumo de servicios

El consumo de servicios a través de WCF se realiza con la clase ChannelFactory.ChannelFactory utiliza el patrón de fábrica para ofrecernos instancias proxy de un contrato de servicio que se conecta con el extremo especificado en la configuración. Podemos configurar la fábrica con información de tiempo de ejecución, como credenciales de seguridad y certificados para cifrado de mensajes, o para determinar la información del extremo dinámicamente.

private IExpenseServiceManager CreateChannelExpenseServiceManager() 
{ 
   ChannelFactory<IExpenseServiceManager> factory = new 
ChannelFactory<IExpenseServiceManager>("ExpenseServiceManager"); 
   IExpenseServiceManager proxy = factory.CreateChannel(); 

   return proxy; 
}

Como puede ver, inicialmente creamos una instancia de la fábrica, que utiliza un argumento genérico para que el contrato de servicio nos permita construir una fábrica más precisa que devolverá sólo instancias del contrato deseado. También especificamos un argumento que determine la configuración que se utilizará para el extremo. En este caso, estamos utilizando una configuración de extremo denominada ExpenseServiceManager, que se refiere a la configuración que tenemos en nuestro archivo de configuración de la aplicación.

<system.serviceModel> 
   <client> 
         <endpoint name="ExpenseServiceManager" 
            address="http://localhost:8081/ExpenseService/Manager" 
            binding="wsHttpBinding" 
            contract="ExpenseContracts.IExpenseServiceManager" /> 
   </client> 
</system.serviceModel>

Puede comprobar que la definición del extremo coincide exactamente con la definición que se declara en la configuración del host. Generalmente, la única vez que tendrá una configuración diferente será cuando la dirección del cliente sea diferente a la del servidor debido a que se está implementando una configuración de red o un comportamiento personalizado.

Si ha instalado Windows SDK, podrá disponer de una herramienta (svcutil) con el fin de automatizar la creación de una configuración de extremos y clases proxy, que podrá integrar en su solución. El servicio de destino debe publicar una descripción de sus metadatos a través de WSDL o WS-Metadataexchange para poder utilizar esta herramienta

Configuración de canales dúplex

Hasta ahora, hemos supuesto que nuestro flujo de comunicación utilizará un patrón de colaboración de solicitud y respuesta, donde los mensajes los envía un consumidor y los responde un servicio. WCF admite varios flujos de mensajes alternativos, como la comunicación dúplex de un solo sentido (“Fire and Forget”) o bidireccional. Si tratamos con un flujo de mensajes en el que cualquier parte puede iniciar una conversación, tendremos que utilizar un dúplex o un canal bidireccional. Los canales dúplex pueden resultar muy efectivos para sistemas conectados de forma más sólida en los que se puedan enviar datos desde cualquier dirección. Un ejemplo de dónde le podría resultar esto útil es a la hora proporcionar devoluciones de llamada desde eventos.

Implementación de devoluciones de llamada de clientes

Las devoluciones de llamada de clientes se implementan en WCF a través de un concepto denominado CallbackContracts. Para el contrato que publiquemos, podemos nombrar un segundo contrato para definir las operaciones que los clientes publicarán y cuyas llamadas se puedan devolver a través de la ejecución de código en el servicio.

Para declarar CallbackContract, especifique el tipo de interfaz como parte del contrato de servicio desde el que se estará devolviendo la llamada.

[ServiceContract(CallbackContract = 
typeof(IExpenseServiceClientCallback))]

También es necesario usar un enlace que admita canales dúplex, como netTcpBinding o wsDualHttpBinding. El dúplex sobre TCP se logra mediante una conexión bidireccional que se establece y mantiene en todo el intercambio de mensajes. Sobre HTTP, esto se logra mediante una devolución de llamada a una escucha de cliente. Dado que puede que el cliente no sea consciente de su ruta de regreso o que desee definir esto de forma más sólida a través de una configuración, podemos utilizar una configuración de enlace personalizada para declarar una dirección clientBaseAddress alternativa.

<endpoint binding="wsDualHttpBinding" 
bindingConfiguration="AlternativeClientCallback"/> 
<bindings> 
   <wsDualHttpBinding> 
      <binding name="AlternativeClientCallback" 
clientBaseAddress="http://localhost:8082/ExpenseService/ClientCallback"/> 
   </wsDualHttpBinding> 
</bindings>

Implementación de devoluciones de llamada en el cliente

Implementar un contrato de devolución de llamada es exactamente lo mismo que implementar un contrato de servicio. Debemos proporcionar una implementación de la interfaz que hemos definido.

class CallbackHandler : IExpenseServiceClientCallback 
{ 
   public void ExpenseReportReviewed( 
ExpenseReportReviewedRequest expenseReportReviewedRequest) 
        { 
            // We implement client logic to respond to the callback here. 
        } 
}

Para permitir que el host tenga una instancia de nuestra clase CallbackHandler en la que devolver la llamada, debemos configurar nuestro canal de cliente de tal manera que sea consciente de la naturaleza dúplex de la conexión.

Antes de nada, como hemos descrito anteriormente, utilizaremos un enlace que admita canales dúplex. En segundo lugar, cuando inicialicemos nuestra conexión con el extremo de servicio, utilizaremos una versión subclasificada de ChannelFactory, denominada DuplexChannelFactory, que creará automáticamente una conexión dúplex para el servicio.

private IExpenseServiceClient CreateChannelExpenseServiceClient() 
{ 
   InstanceContext context = new InstanceContext(new CallbackHandler()); 

   DuplexChannelFactory<IExpenseServiceClient> factory = 
new DuplexChannelFactory<IExpenseServiceClient>(context, 
"ExpenseServiceClient"); 
   IExpenseServiceClient proxy = factory.CreateChannel(); 

   return proxy; 
}

La diferencia clave al usar DuplexChannelFactory es que inicializamos una instancia de nuestra clase CallbackHandler y la transferimos al constructor para que la fábrica inicialice un contexto que se utilice en las devoluciones de llamada.

Implementación de devoluciones de llamada desde el host

Desde la perspectiva del host, podemos obtener una referencia para devolver la llamada a nuestro cliente a través del canal de devolución de llamada que se define en nuestro contrato IExpenseServiceClient.

[ServiceContract(CallbackContract = 
typeof(IExpenseServiceClientCallback))] 
public interface IExpenseServiceClient : IExpenseService

El atributo CallbackContract declara la interfaz que define el contrato para las devoluciones de llamada realizadas desde el host.

Para realizar la devolución de llamada, obtenemos una referencia al contrato de devolución de llamada llamando a OperationContext.Current.GetCallbackChannel, como se muestra aquí.

IExpenseServiceClientCallback callback = 
                   OperationContext.Current.GetCallbackChannel 
<IExpenseServiceClientCallback>(); 
callback.ExpenseReportReviewed(new 
ExpenseReportReviewedRequest(e.Report));

Después de que tengamos una referencia a nuestro canal de devolución de llamada, podemos llamarlo con normalidad.

A continuación nuestro amigo Jeremy Boyd nos da algunas instrucciones que debemos recordar al diseñar los servicios:

Debe incluir flujos de trabajo de larga ejecución a través del uso de un servicio de persistencia.
Una operación de servicio puede interactuar a través de un flujo de trabajo en ejecución, a través del desencadenamiento de eventos. Los flujos de trabajo se deben diseñar para desencadenar eventos cuando se exija atención y responder a eventos cuando se esté interactuando externamente (por ejemplo, desde un servicio o un usuario externos).
Los flujos de trabajo se ejecutarán asincrónicamente con respecto a la llamada de servicio; por tanto, realice un diseño apropiado cuando piense en la devolución de datos desde el servicio o en qué estado se podrían encontrar los datos en ese momento. Si desea utilizar un enfoque sincrónico, puede utilizar la clase ManualWorkflowSchedulerService para permitir una programación manual de la ejecución de flujos de trabajo.

Fuente: http://www.microsoft.com/spanish/msdn/articulos/

Publicado por: Jeremy Boyd, consultor experto técnico de Intergen, proveedor de soluciones de Nueva Zelanda y Partner Gold Certified de Microsoft, así como Director regional de MSDN en la comunidad de Nueva Zelanda.

La forma más fácil y productiva de desarrollar software para la plataforma Microsoft .NET® es sin duda con ayuda de Visual Studio .NET®. En realidad, recomiendo que los interesados se suscriban a “MSDN Professional”. Es un poco más cara que Visual Studio únicamente, pero incluye mucho software adicional, como todos los sistemas operativos de Microsoft, SDKs, DDKs y una “base de conocimiento”, además de un año de actualizaciones.A pesar de todas las ventajas que presenta Visual Studio, es posible desarrollar para la plataforma .NET sin él. Para ello, debe obtener el “SDK de .NET Framework”, que puede descargar de http://msdn.microsoft.com/downloads/default.asp. El tamaño total es de más de 130 MB y está disponible tanto en un único archivo como en varios archivos separados.

Observe que NO se trata del runtime de .NET Framework. El runtime se conoce como “.NET Framework redistribuible”, tiene aproximadamente 20 MB y estará disponible en breve en otros idiomas además del inglés.

El SDK incluye el runtime, varias herramientas de desarrollo y documentación. Permite la creación de cualquier tipo de aplicación: consola, DLLs, Windows, ASP.NET y servicios de Web. Está claro que tendremos que programar como se hacía hace muchos años, creando los programas en un editor de textos como Notepad y utilizando herramientas de línea de comandos.

Veamos cómo crear algunos tipos de aplicaciones utilizando el lenguaje C# y el “SDK de .NET Framework”. Partimos del principio de que usted ha descargado e instalado el SDK. Los ejemplos de este artículo fueron probados en una instalación nueva de Windows XP, agregando únicamente las actualizaciones indicadas en el sitio “Windows Update” y en el SDK de Framework.

Aplicación en modo de consola.

Se trata del tipo más fácil de desarrollar. Escriba el programa siguiente en Notepad y guárdelo con el nombre “HolaConsola.cs”:

using System; 

class Hola { 
  public static void Main() { 
    Console.WriteLine("Hola mundo, desde la consola"); 
  } 
}

El programa “CSC.EXE” es el compilador de línea de comandos de C#. Toma uno o varios archivos “cs” y los compila para crear archivos .EXE o .DLL.

Aplicaciones de Web.

Podemos crear aplicaciones de ASP.NET de una forma muy parecida al ASP tradicional, donde sólo teníamos un archivo que combinaba el código HTML con código del lenguaje de programación.

Para crear una aplicación de Web de esta forma, basta con crear archivos “aspx” en el directorio del servidor de Web, normalmente c:\Inetpub\wwwroot. Como ejemplo, cree un archivo con el nombre “HolaSencillo.aspx” .


Hola desde una página ASP.NET sencilla

rn”);
Response.Write(“Hola mundo!”);
Response.Write(“rn”);
}
%>Observe lo siguiente:

  • La primera línea indica el lenguaje utilizado.
  • Al igual que en el ASP tradicional, el código puede ser situado entre “”.
  • Estamos usando el lenguaje C#, lo que permite una programación mucho más avanzada que con el ASP tradicional. Podríamos usar cualquier lenguaje disponible para la plataforma .NET.
  • El programa se compilará automáticamente cuando se llame a la página por primera vez.

Puede probar el proyecto anterior abriendo el navegador y navegando hasta el URL “http://localhost/HolaSencillo.aspx”:

Al programar de esta forma, usted pierde las facilidades que ofrece una herramienta de tipo RAD, pero puede beneficiarse de algunas ventajas exclusivas de la plataforma .NET, como los controles que se ejecutan en el servidor. Los controles que se ejecutan en el servidor suponen varias ventajas:

  • Procesan las entradas del navegador: no es necesario usar la propiedad Request.
  • Generan una salida a partir de sus propiedades: podemos generar una salida con sólo alterar las propiedades y haciendo llamadas a métodos, sin usar el objeto Response.
  • Conservan su estado cuando la página recibe un PostBack (cuando la página se llama a sí misma).

Veamos como ejemplo una calculadora que usa controles del servidor, creada en el archivo CalcComps.aspx:

0 0
private void Button1_Click(object sender, System.EventArgs e) { double N1 = Convert.ToDouble(TextBox1.Text); double N2 = Convert.ToDouble(TextBox2.Text); double R = N1 + N2; ListBox1.Items.Add(R.ToString()); } override protected void OnInit(EventArgs e) { Button1.Click += new System.EventHandler(Button1_Click); base.OnInit(e); }

Veamos el resultado del programa:

Observe lo siguiente:

  • La página contiene varios componentes con el atributo “runat=server”. Esto significa que se creará en el servidor una instancia del componente correspondiente, cada vez que se llame a la página.
  • Los componentes procesan la entrada, generan la salida y conservan su estado. Observe que los componentes TextBox y ListBox conservan sus contenidos sin que tengamos que hacer nada.
  • El código se encuentra dentro de un bloque SCRIPT.
  • La llamada al método OnInit se realiza con la carga inicial de la página. En él, se asocia el evento Click del botón al código que procesará el evento.
  • Los valores de los campos se obtienen en las propiedades de los componentes, en lugar del objeto Request.
  • La salida se genera indirectamente. En primer lugar alteramos las propiedades de los componentes, que a su vez crean una página HTML, acorde con el navegador utilizado remotamente.

WebServices.

Para desarrollar un servicio de Web sin Visual Studio .NET, sólo es necesario crear un archivo con la extensión “asmx” en el directorio del servidor de Web, normalmente c:\Inetpub\wwwroot. Cree un archivo con el nombre “MiServicio.asmx” y escriba el código siguiente:


using System.Web.Services; 

[WebService(Namespace="http://picaplan.com.br/webservices/")] 
public class Cuentas: System.Web.Services.WebService { 
  [WebMethod] 
  public double Suma(double A, double B) { 
    return A + B; 
  } 
  [WebMethod] 
  public double Producto(double A, double B) { 
    return A * B; 
  } 
}

Puede llamar al servicio de Web desde un navegador de Web. En este caso, se crea automáticamente una página de prueba.

También se crea automáticamente una página con la descripción del servicio, con el estándar WDSL.

Observe lo siguiente:

  • La primera línea indica que la página es un servicio de Web y que el lenguaje utilizado es C#.
  • La clase Cuentas contendrá los métodos a los que se llamará de forma remota.
  • La clase Cuentas se deriva de System.Web.Services.WebService. Esto no es imprescindible, pero resulta útil si necesita tener acceso a las variables de sesión, los encabezados de HTTP y otras características del protocolo SOAP.
  • El atributo “Namespace” no es absolutamente imprescindible para que funcione el servicio de Web, pero la norma incluye el requisito de asignar un nombre exclusivo al servicio de Web, basado normalmente en un URL al que usted tenga acceso.
  • El atributo “WebMethod” es imprescindible e indica que es posible llamar al método a través de SOAP.
  • Los tipos entregados y devueltos por los métodos deben ser “serializables”. Los tipos numéricos, string, struct y arrays son serializables. Hay otras clases de la biblioteca, por ejemplo DataSet, que también son serializables.

Llamadas a servicios de Web.

La forma más fácil de llamar a un servicio de Web es crear una clase Proxy que funciona exactamente como una clase de .NET, pero que es capaz de llamar al servicio de Web. Esto puede hacerse con la utilidad WSDL.EXE. El comando que permite generar una clase capaz de llamar al servicio de Web anterior sería el siguiente:

C:>wsdl http://localhost/MiServicio.asmx

Este comando crea un archivo con el mismo nombre que la clase que implementa el servicio de Web, “Cuentas.cs” en nuestro caso.

Llamaremos al servicio de Web de la aplicación siguiente en modo de consola, en el archivo “LlamarCuentas.cs”:

using System; 

class Hola { 
  public static void Main() { 
    Cuentas C = new Cuentas(); 
    double R = C.Suma(10, 30); 
    Console.WriteLine(R); 
  } 
}

La aplicación anterior debe ser compilada con el comando siguiente, para unir los dos archivos fuente en el mismo ejecutable y generar el ejecutable LlamarCuentas.EXE:

C:>csc LlamarCuentas.cs Cuentas.cs


Fuente:
http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art58.asp 
Escrito por Mauro Sant'Anna (mas_mauro@hotmail.com). Mauro es Director regional de MSDN,
consultor e instructor de MAS Informática (www.mas.com.br).