Compartir a través de


Extensibilidad del host del servicio de flujo de trabajo

.NET Framework 4.6.1 proporciona la WorkflowServiceHost clase para hospedar servicios de flujo de trabajo. Esta clase se usa cuando se hospeda automáticamente un servicio de flujo de trabajo en una aplicación administrada o en un servicio de Windows. Esta clase también se usa al hospedar un servicio de flujo de trabajo con Internet Information Services (IIS) o servicio de activación de procesos de Windows (WAS). La WorkflowServiceHost clase proporciona puntos de extensión que permiten agregar extensiones personalizadas, cambiar el comportamiento inactivo y hospedar flujos de trabajo que no son de servicio (flujos de trabajo que no usan actividades de mensajería).

Extensiones del host de servicio de flujo de trabajo

WorkflowServiceHost contiene una propiedad WorkflowExtensions de tipo WorkflowInstanceExtensionManager que proporciona métodos para agregar extensiones a WorkflowServiceHost. Use el Add método 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 se crea o se carga una instancia del servicio de workflow desde un almacén de persistencia. Use el Add método para agregar una extensión para cada host de servicio de flujo de trabajo, una instancia de la extensión se comparte para todas las instancias de servicio de flujo de trabajo.

Reaccionar a excepciones no controladas

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

  • Abandon : anula la instancia del servicio de flujo de trabajo.

  • AbandonAndSuspend : revierte al último estado persistente y suspende la instancia del servicio de flujo de trabajo. Esto solo ocurre si el flujo de trabajo ya se ha conservado al menos una vez. Si no, se aborta la instancia de flujo de trabajo.

  • Cancel : cancela la instancia.

  • Terminate : finaliza la instancia.

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

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

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

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

Hospedaje de flujos de trabajo que no son de servicio

WorkflowServiceHost se puede usar para hospedar flujos de trabajo que no son de servicio o flujos de trabajo que no comienzan por una Receive actividad o flujos de trabajo que no usan las actividades de mensajería. Normalmente, los servicios de flujo de trabajo comienzan con una Receive actividad. Cuando WorkflowServiceHost recibe un mensaje para un servicio de flujo de trabajo, si no está ya en ejecución (o persistido), se crea una nueva instancia del servicio de flujo de trabajo. 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 que no sea de servicio, derive una clase de WorkflowHostingEndpoint e invalide OnGetInstanceId, OnGetCreationContexty OnResolveBookmark. Sobreescriba OnGetInstanceId si desea proporcionar un ID de instancia preferido. Sobrescriba OnGetCreationContext para crear un contexto personalizado de creación de flujos de trabajo o completar una instancia existente de WorkflowCreationContext. Invalide OnResolveBookmark para extraer manualmente el marcador del mensaje entrante. Si invalida este método, debe invocar el método SendResponse en su cuerpo igual que al responder al mensaje enviado al WorkflowHostingEndpoint. Si no lo hace, es posible que eventualmente se supere un límite MaxConcurrentCalls. En contratos bidireccionales, es posible que pueda detectar que no se puede invocar al método SendResponse debido a que el cliente no puede recibir una respuesta. En los contratos unidireccionales, puede que no reconozca el error que se produce cuando no se puede llamar al método SendResponse hasta que sea demasiado tarde, después de que se supere el límite de la propiedad MaxConcurrentCalls. Para crear una nueva instancia de un flujo de trabajo que no sea de servicio, declare un contrato de servicio que defina una operación que cree una nueva instancia. La operación de creación debería tomar IDictionary<cadena, objeto> para pasar los parámetros de flujo de trabajo necesarios. Este contrato se implementa implícitamente mediante la WorkflowHostingEndpointclase derivada de . Al hospedar el flujo de trabajo, agregue una instancia de la clase derivada WorkflowHostingEndpoint al host llamando a AddServiceEndpoint y llamando a Open. Para crear una instancia del flujo de trabajo, cree un ChannelFactory<TChannel> de su tipo de contrato de servicio y llame a CreateChannel. A continuación, puede invocar la operación de creación definida en el contrato de servicio.

Consulte también