Compartir vía


Extensibilidad de host de servicio de flujo de trabajo

.NET Framework 4.6.1 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 inactivo y hospedar flujos de trabajo no pertenecientes al 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 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>
</behaviors>

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. 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, puede que a la larga 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 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 los parámetros de flujo de trabajo necesarios. 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<TChannel> 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.

Consulte también