Detalles de las características de Windows Workflow Foundation

.NET Framework 4 agrega una serie de características a Windows Workflow Foundation. Este documento describe algunas de las nuevas características y proporciona detalles sobre los escenarios en que pueden ser útiles.

Actividades de mensajería

Las actividades de mensajería (Receive, SendReply, Send, ReceiveReply) se usan para enviar y recibir mensajes de WCF del flujo de trabajo. Las actividades Receive y SendReply se usan para formar una operación de servicio de Windows Communication Foundation (WCF) que se expone a través de WSDL igual que los servicios web WCF estándar. Send y ReceiveReply se usan para consumir un servicio web similar a una fábrica ChannelFactory de WCF, una experiencia de Agregar referencia de servicio también existe para Workflow Foundation que genera actividades configuradas previamente.

Introducción a las actividades de mensajería

  • En Visual Studio 2012, cree un proyecto de aplicación de servicio de flujo de trabajo WCF. Se colocará un par Receive y SendReply en el lienzo.

  • Haga clic con el botón derecho en el proyecto y seleccione Agregar referencia de servicio. Seleccione un WSDL de servicio web existente y haga clic en Aceptar. Compile el proyecto para mostrar las actividades generadas (implementadas con Send y ReceiveReply) en el cuadro de herramientas.

  • Documentación de servicios del flujo de trabajo

Escenario de ejemplo de actividades de mensajería

Un servicio BestPriceFinder llama a varios servicios de aerolíneas para encontrar el mejor precio de vale para una ruta determinada. La implementación de este escenario requeriría el uso de las actividades de mensajes para recibir la solicitud de precio, recuperar los precios de los servicios de back-end y responder a la solicitud de precio con el mejor precio. También requeriría usar otras actividades para uso inmediato para crear la lógica empresarial para calcular el mejor precio.

WorkflowServiceHost

La clase WorkflowServiceHost es el host de flujo de trabajo para uso inmediato que hospeda varias instancias, la configuración y la mensajería de WCF (aunque no es necesario que los flujos de trabajo usen la mensajería para que se hospeden). También se integra con la persistencia, el seguimiento y el control de instancias a través de un conjunto de comportamientos de servicio. Al igual que la clase ServiceHost de WCF, WorkflowServiceHost puede autohospedarse en una aplicación de consola, WinForms o WPF, en un servicio de Windows u hospedado en web (como un archivo .xamlx) en IIS o WAS.

Introducción a host de servicio de flujo de trabajo

Escenario de WorkflowServiceHost

Un servicio BestPriceFinder llama a varios servicios de aerolíneas para encontrar el mejor precio de vale para una ruta determinada. La implementación de este escenario requeriría hospedar el flujo de trabajo en WorkflowServiceHost. Usaría también las actividades de mensajes para recibir la solicitud de precio, recuperar los precios de los servicios de back-end y responder a la solicitud de precio con el mejor precio.

Correlation

Una correlación es una de estas dos cosas:

  • Una forma de agrupar mensajes; es decir, la relación entre un mensaje de solicitud y su respuesta.

  • Una forma de asignar un fragmento de datos a una instancia de servicio.

Introducción

  • Para iniciarse en la correlación, cree un nuevo proyecto en Visual Studio. Cree una variable de tipo CorrelationHandle.

  • Un ejemplo de correlación utilizado para agrupar mensajes es una correlación solicitud-respuesta que agrupa los mensajes.

  • Un ejemplo de asignación de un fragmento de datos a una instancia de servicio es la correlación basada en contenido que asigna un fragmento de datos (por ejemplo, un identificador de pedido) a una instancia de flujo de trabajo en particular.

    • En cualquier actividad de mensajería, haga clic en la propiedad CorrelationInitializers y agregue un elemento QueryCorrelationInitializer utilizando la variable CorrelationHandle creada anteriormente. Haga doble clic en la propiedad deseada en el mensaje (por ejemplo, OrderID) del menú desplegable. Establezca la propiedad CorrelatesWith en la variable CorrelationHandle utilizada anteriormente.
  • Documentación conceptual de correlación

Escenario de correlación

Un flujo de trabajo de procesamiento de pedidos se usa para controlar la creación de nuevos pedidos y actualizar los pedidos existentes que están en proceso. La implementación de este escenario requeriría hospedar el flujo de trabajo en WorkflowServiceHost y usar las actividades de mensajería. También requeriría una correlación basada en orderId para asegurarse de que las actualizaciones se hacen en el flujo de trabajo correcto.

Configuración simplificada

El esquema de configuración de WCF es complejo y proporciona a los usuarios muchas dificultades para encontrar características. En .NET Framework 4.6.1, nos hemos centrado en ayudar a los usuarios de WCF a configurar sus servicios con las siguientes características:

  • Eliminar la necesidad de configuración por servicio explícita. Si no configura elementos <service> para su servicio y este no define puntos de conexión mediante programación, se agregará automáticamente al servicio un conjunto de puntos de conexión, uno por cada dirección base del servicio y por cada contrato implementado por el servicio.

  • Permite al usuario definir valores predeterminados para los comportamientos y enlaces de WCF, que se aplicarán a los servicios sin ninguna configuración explícita.

  • Los puntos de conexión estándar definen puntos de conexión preconfigurados reutilizables, que tienen valores fijos para una o varias propiedades de punto de conexión (dirección, enlace y contrato), y permiten la definición de propiedades personalizadas.

  • Finalmente, ConfigurationChannelFactory<TChannel> permite realizar la administración central de la configuración del cliente WCF, que es útil en escenarios en que la configuración se selecciona o se cambia después del tiempo de carga del dominio de aplicación.

Introducción

Escenarios de configuración simplificados

  • Un desarrollador de ASMX experimentado quiere empezar a utilizar WCF. Sin embargo, WCF parece también demasiado complicado. ¿Qué es toda la información que necesito escribir en un archivo de configuración? En .NET 4, se puede decidir incluso no tener un archivo de configuración en absoluto.

  • Un conjunto existente de servicios de WCF es muy difícil de configurar y mantener. El archivo de configuración tiene miles de líneas de código XML cuya modificación es sumamente peligrosa. Se necesita ayuda para reducir esa cantidad de código a algo más fácil de tratar.

Resolución del contrato de datos

En .NET Framework 3.5, había unas cuantas limitaciones en el diseño de tipos conocidos:

  • No era posible agregar tipos conocidos dinámicamente durante la serialización o la deserialización.

  • Los serializadores no podían tratar información de xsi:type desconocida.

  • No era posible que los usuarios especificasen qué xsi:type preferirían que apareciese en la conexión para, por ejemplo, reducir el tamaño de una instancia de serialización en la conexión.

DataContractResolver resuelve estos problemas en .NET Framework 4.5.

Introducción

Escenarios de resolución del contrato de datos

  • Evitar tener que declarar decenas de objetos KnownTypeAttribute en un servicio.

  • Reducir el tamaño del blob XML.

Diagrama de flujo

El diagrama de flujo es un paradigma conocido para representar visualmente los problemas de dominio. Es un nuevo estilo de flujo de control que se está introduciendo en .NET Framework 4. Una característica básica de diagrama de flujo es que solo se ejecuta una actividad en un momento dado. Los diagramas de flujo pueden expresar bucles y resultados alternativos, pero no pueden expresar de forma nativa la ejecución simultánea de varios nodos.

Introducción

Escenarios de diagrama de flujo

Una actividad de diagrama de flujo se puede utilizar para implementar un juego de adivinanzas. Este juego es muy simple: el equipo selecciona un número aleatorio y el jugador tiene que adivinar el número. Cuando el jugador envía cada respuesta, el equipo le muestra una sugerencia (por ejemplo, "intente un número más pequeño"). Si el jugador encuentra el número en menos de 7 intentos, recibe una felicitación especial por parte del equipo. Este juego se puede implementar con una combinación de las siguientes actividades de procedimiento:

Actividades de procedimiento (Sequence, If, ForEach, Switch, Assign, DoWhile, While)

Las actividades de procedimiento proporcionan un mecanismo para modelar el flujo de control secuencial utilizando conceptos familiares para los programadores. Estas actividades habilitan tradicionalmente construcciones de lenguaje de programación estructurada y, cuando corresponde, proporcionan paridad de lenguaje con lenguajes comunes de procedimiento como C# y Visual Basic.

Introducción

Escenarios de actividad de procedimiento

  • Parallel: un sistema de administración de documentos de intranet tiene un flujo de trabajo de aprobación de documentos. Los documentos necesitan ser aprobados por personas en varios departamentos antes de poderse publicar en la intranet. No hay un orden establecido para las aprobaciones; se pueden producir en cualquier momento mientras el documento esté en la fase de "pendiente de aprobación". Cuando un usuario envía un documento para su revisión, este debe aprobarlo su superior directo, el administrador de la intranet y el administrador de comunicaciones internas.

  • ParallelForEach<T>: una aplicación de WF administra las compras corporativas dentro de una gran compañía. Las reglas corporativas establecen que, antes de planear cualquier operación de compra, se requieren las valoraciones de tres proveedores diferentes. Un empleado del departamento de compras selecciona tres proveedores de la lista de proveedores de la compañía. Una vez seleccionados e informados estos proveedores, la compañía esperará a que realicen sus propuestas económicas. Las propuestas pueden llegar en cualquier orden. Para implementar este escenario en WF, se utiliza un elemento ParallelForEach<T> que recorrerá en iteración la colección de proveedores y pedirá sus propuestas económicas. Una vez reunidas todas las ofertas, se selecciona y se muestra la mejor.

InvokeMethod

La actividad InvokeMethod permite invocar métodos públicos en objetos o tipos dentro del ámbito. Admite la invocación de métodos estáticos y de instancia con o sin parámetros (incluidas matrices de parámetros) y de métodos genéricos. También permite la ejecución de métodos sincrónica y asincrónicamente.

Introducción

  • En Visual Studio 2012, cree una aplicación de consola de flujo de trabajo. Agregue una actividad InvokeMethod en el diseñador de flujo de trabajo y configure en él métodos estáticos y de instancia.

  • Documentación del diseñador: Diseñador de actividad InvokeMethod

Escenarios de InvokeMethod

  • Se necesita invocar un método en un objeto dentro del ámbito. Por ejemplo, se necesita agregar un valor a un diccionario. Se invoca el método Add de la instancia del diccionario y se proporcionan la clave y el valor.

  • Se necesita invocar un método en un objeto CLR heredado. En lugar de crear una actividad personalizada para encapsular la llamada a esa clase heredada, si permanece dentro del ámbito durante la ejecución del flujo de trabajo, se puede utilizar InvokeMethod.

Actividades de control de errores

La actividad TryCatch proporciona un mecanismo para detectar excepciones que se producen durante la ejecución de un conjunto de actividades contenidas (similar a la construcción Try/Catch en C# y Visual Basic). TryCatch proporciona control de excepciones en el nivel de flujo de trabajo. Cuando se produce una excepción no controlada, se anula el flujo de trabajo y no se ejecutará el bloque Finally. Este comportamiento es coherente con C#.

Introducción

Escenarios de control de errores

Necesita ejecutarse un conjunto de actividades y es necesaria la ejecución de una lógica específica cuando se produce un error. Si durante esa lógica de control de errores se encuentra que el error no es recuperable, volverá a producirse la excepción y la actividad primaria (o el host) abordará el problema.

Actividad Pick

La actividad Pick proporciona un modelado de flujo de control basado en eventos en WF. Pick contiene muchas bifurcaciones donde cada bifurcación espera que se produzca un evento determinado antes de ejecutarse. En esta configuración, el comportamiento de Pick es similar al de Switch<T>, ya que la actividad solo ejecutará un evento del conjunto de eventos de los que está realizando escuchas. Cada bifurcación está orientada a eventos y el evento que se produzca ejecutará primero la bifurcación correspondiente. El resto de bifurcaciones se cancelan y se dejan de realizar escuchas de eventos.

Introducción

Escenario de Pick

Se necesita solicitar una entrada a un usuario. En circunstancias normales, el desarrollador utilizaría una llamada a un método como ReadLine para solicitar la entrada de un usuario. El problema con esta configuración es que el programa espera hasta que el usuario especifica algo. En este escenario, se necesita un tiempo de espera para desbloquear una actividad de bloqueo. Un escenario común es el que requiere que una tarea se complete dentro de un período de tiempo determinado. El agotamiento del tiempo de espera de una actividad de bloqueo es un escenario en el que Pick agrega gran cantidad de valor.

Servicio de enrutamiento de WCF

El servicio de enrutamiento está diseñado para ser un enrutador de software genérico que permite controlar cómo fluyen los mensajes de WCF entre los clientes y los servicios. El servicio de enrutamiento le permite desacoplar los clientes de los servicios, lo que le ofrece mucha más libertad en términos de las configuraciones que puede admitir y la flexibilidad que tiene al considerar cómo hospedar los servicios. En .NET Framework 3.5, los clientes y los servicios estaban estrechamente acoplados. Un cliente tenía que saber sobre todos los servicios a los que necesitaba comunicarse y dónde se encontraban. Además, WCF en .NET Framework 3.5 tenía las siguientes limitaciones:

  • El control de errores era complejo, ya que esta lógica tenía que codificarse de forma rígida en el cliente.

  • Los clientes y los servicios tenían que utilizar siempre los mismos enlaces.

  • Los servicios raramente se factorizaban correctamente: es más fácil que el cliente hable con un servicio que implementa todo en lugar de tener que elegir entre varios servicios.

El servicio del enrutamiento en .NET 4 está diseñado para facilitar la solución de estos problemas. El nuevo servicio de enrutamiento tiene las siguientes características:

  1. Enrutamiento basado en contenido (los objetos MessageFilter examinan un mensaje para determinar dónde se debe enviar).

  2. Protocolo de puente (transporte y mensaje)

  3. Control de errores (el enrutador detecta excepciones de comunicación y no puede establecer comunicación con los puntos de conexión de reserva)

  4. Actualización dinámica (en memoria) de MessageFilterTable<TFilterData> y configuración de enrutamiento.

Introducción

  1. Documentación: Enrutamiento

  2. Ejemplos: Servicios de enrutamiento [ejemplos de WCF]

  3. Blog: Reglas de enrutamiento

Escenarios de enrutamiento

El servicio de enrutamiento es útil en los siguientes escenarios:

  • Los clientes pueden hablar con varios servicios sin tener que dirigirse a todos ellos directamente.

  • Los clientes pueden realizar lógica adicional en la solicitud de un cliente para determinar dónde hay que enrutarlo.

  • Descomponer las operaciones que un cliente realiza en varias implementaciones de servicio sin refactorizar el cliente.

  • Los clientes y los servicios pueden hablar con enlaces diferentes que tienen configuraciones de seguridad diferentes.

  • Puede habilitarse a los clientes para que sean más sólidos ante errores o la no disponibilidad de servicios.

Detección de WCF

La detección de WFC es una tecnología de .NET Framework que permite incorporar un mecanismo de detección a la infraestructura de las aplicaciones. Puede utilizarla para hacer su servicio reconocible y configurar los clientes para buscar los servicios. Los clientes ya no necesitan estar codificados de forma rígida con el extremo, lo que hace que la aplicación sea más sólida y tolerante a los errores. La detección es la plataforma perfecta para integrar capacidades de autoconfiguración en la aplicación.

El producto se basa en la norma WS-Discovery. Está diseñado para ser interoperable, extensible y genérico. El producto admite dos modos de operación:

  1. Administrado: donde hay una entidad en la red con gran conocimiento de los servicios existentes; los clientes la consultan directamente para obtener información. Esto es análogo a Active Directory.

  2. Ad hoc: donde los clientes utilizan los mensajes de multidifusión para buscar los servicios.

Además, los mensajes de detección son válidos para distintos protocolos de red; pueden utilizarse sobre cualquier protocolo que admita los requisitos de modo. Por ejemplo, los mensajes de multidifusión de detección pueden enviarse a través del canal UDP o cualquier otra red que admita la mensajería de multidifusión. Estos puntos de diseño, combinados con la flexibilidad de la característica, permiten adaptar la detección específicamente a la solución.

Introducción

Escenarios de detección

Un desarrollador no desea programar de forma rígida los puntos de conexión, porque no se sabe cuándo estará disponible un servicio determinado. En su lugar, quiere elegir un servicio en tiempo de ejecución. Se necesita más desacoplamiento, solidez y autoconfiguración entre los componentes de la aplicación.

Seguimiento

El seguimiento de flujos de trabajo proporciona información sobre la ejecución de una instancia de flujo de trabajo. Los eventos de seguimiento se emiten desde un flujo de trabajo en el nivel de instancia de flujo de trabajo y cuando se ejecutan las actividades en el flujo de trabajo. Se necesita agregar un participante de seguimiento de flujo de trabajo al host de flujo de trabajo para suscribirse a los registros de seguimiento. Los registros de seguimiento se filtran utilizando un perfil de seguimiento. .NET Framework proporciona un participante de seguimiento ETW (Seguimiento de eventos para Windows) y se instala un perfil básico en el archivo machine.config.

Introducción

  1. En Visual Studio 2010, cree un proyecto de aplicación de servicio de flujo de trabajo WCF. Se colocará un par Receive y SendReply en el lienzo para empezar.

  2. Abra web.config y agregue un comportamiento de seguimiento de ETW sin ningún perfil.

    1. Se utiliza el perfil predeterminado.

    2. Abra el visor de eventos y habilite el canal analítico en el nodo siguiente: Visor de eventos, Registros de aplicaciones y servicios, Microsoft, Windows, Servidor de aplicaciones-Aplicaciones. Haga clic con el botón secundario en el elemento Analítico y seleccione Habilitar registro.

    3. Ejecute el servicio de flujo de trabajo.

    4. Observe los eventos de seguimiento de flujo de trabajo en el visor de eventos.

  3. Ejemplos: Seguimiento

  4. Documentación conceptual: Seguimiento y seguimiento de flujos de trabajo

Almacén de instancias de flujo de trabajo de SQL

SqlWorkflowInstanceStore es una implementación basada en SQL Server de un almacén de instancias. Un almacén de instancias almacena el estado de una instancia en ejecución junto con todos los datos necesarios para cargar y reanudar esa instancia. El host de servicio indica al almacén de instancias que guarde el estado de la instancia si el flujo de trabajo persiste y le indica también que cargue el estado de la instancia cuando llegue un mensaje para esa instancia o expire una actividad Delay.

Introducción

  1. En Visual Studio 2012, cree un flujo de trabajo que contenga una actividad Persist implícita o explícita. Agregue el comportamiento de SqlWorkflowInstanceStore al host de servicio de flujo de trabajo. Esto se puede realizar en el código o en el archivo de configuración de la aplicación.

  2. Ejemplos: Persistencia

  3. Documentación conceptual: Almacén de instancias de flujo de trabajo de SQL.