Compartir a través de


Extensibilidad de host de servicio de flujo de trabajo

Este tema es aplicable a Windows Workflow Foundation 4.

.NET Framework versión 4 proporciona la clase WorkflowServiceHost para hospedar servicios de flujo de trabajo. Esta clase se usa cuando auto-hospeda un servicio de flujo de trabajo en una aplicación administrada o en un servicio Windows. Esta clase también se usa al hospedar un servicio de flujo de trabajo con Internet Information Services (IIS) o el Servicio de activación de procesos de Windows (WAS). La clase WorkflowServiceHost proporciona puntos de extensión que le permiten agregar extensiones personalizadas, cambiar el comportamiento de inactividad y hospedar flujos de trabajo no pertenecientes al servicio (flujos de trabajo que no usan actividades de mensajería). Para obtener un ejemplo de cómo cambiar el comportamiento de inactividad, vea How To: Control Idle Behavior Through Extensibility.

Extensiones del host de servicio de flujo de trabajo

WorkflowServiceHost contiene una propiedad WorkflowExtensions de tipo WorkflowInstanceExtensionManager que ofrece métodos para agregar extensiones a WorkflowServiceHost. Use el método Add para agregar una extensión para cada instancia de servicio de flujo de trabajo. Se llama al delegado especificado para crear una nueva extensión cuando una instancia de servicio de flujo de trabajo se crea o se carga de un almacén de persistencia. Use el método Add para agregar una extensión para cada host de servicio de flujo de trabajo; se comparte una instancia de la extensión para todas las instancias de servicio de flujo de trabajo.

Reaccionar ante excepciones no controladas

WorkflowUnhandledExceptionBehavior permite especificar la acción que debe emprenderse cuando se produce una excepción no controlada dentro de un servicio de flujo de trabajo. La propiedad Action especifica uno de los valores WorkflowUnhandledExceptionAction:

  • Abandon. Anula la instancia de servicio de flujo de trabajo.

  • AbandonAndSuspend. Deshace hasta el último estado guardado y suspende la instancia de servicio de flujo de trabajo. Esto solo ocurre si ya se ha guardado el flujo de trabajo por lo menos una vez. Si no es así, se anula la instancia de flujo de trabajo.

  • Cancel. Cancela la instancia.

  • Terminate. Termina la instancia.

Este comportamiento se puede configurar en código, tal y como se muestra en el siguiente ejemplo.

host.Description.Behaviors.Add(new WorkflowUnhandledExceptionBehavior { Action = WorkflowUnhandledExceptionAction.Abandon });

También se puede configurar en un archivo de configuración, tal y como se muestra en el siguiente ejemplo.

<behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
          <workflowUnhandledExceptionBehavior action="Abandon" />      
        </behavior>
      </serviceBehaviors>

Hospedar flujos de trabajo no pertenecientes al servicio

WorkflowServiceHost se puede utilizar para hospedar flujos de trabajo no pertenecientes al servicio, o flujos de trabajo que no comienzan con una actividad Receive o que no usan las actividades de mensajería. Los servicios de flujo de trabajo suelen comenzar por una actividad Receive. Cuando WorkflowServiceHost recibe un mensaje para un servicio de flujo de trabajo, se crea una nueva instancia de servicio de flujo de trabajo si aún no se está ejecutando (o no se ha guardado). Si un flujo de trabajo no comienza con una actividad Receive, no se puede iniciar enviando un mensaje porque no hay ninguna actividad para recibir el mensaje. Para hospedar un flujo de trabajo no perteneciente al servicio, derive una clase de WorkflowHostingEndpoint e invalide OnGetInstanceId, OnGetCreationContext y OnResolveBookmark. Invalide OnGetInstanceId si desea proporcionar un identificador de instancia preferido. Invalide OnGetCreationContext para crear un contexto de creación de flujo de trabajo personalizado o rellene una instancia de la clase WorkflowCreationContext existente. Invalide OnResolveBookmark para extraer manualmente el marcador del mensaje entrante. Para crear una nueva instancia de un flujo de trabajo no perteneciente al servicio, declare un contrato de servicios que defina una operación que cree una nueva instancia. La operación de creación debería tomar IDictionary<cadena, objeto> para pasar cualquier parámetro de flujo de trabajo necesario. Este contrato está implícitamente implementado por la case derivada de WorkflowHostingEndpoint. Al hospedar el flujo de trabajo, agregue una instancia de la clase derivada de WorkflowHostingEndpoint al host llamando a AddServiceEndpoint y llame a Open. Para crear una instancia del flujo de trabajo, cree una clase ChannelFactory de su tipo de contrato de servicios y llame e CreateChannel. A continuación, puede llamar a la operación de creación definida en el contrato de servicios.

Vea también

Conceptos

Utilizar actividades de mensajería

Otros recursos

Servicios de flujo de trabajo