Compartir a través de


Procedimiento para habilitar la persistencia de SQL para flujos de trabajo y servicios de flujo de trabajo

En este artículo se describe cómo configurar la característica Almacén de instancias de flujo de trabajo de SQL para habilitar la persistencia para los flujos de trabajo y servicios de flujo de trabajo, según la programación, o mediante un archivo de configuración.

Windows Server APp Fabric simplifica el proceso de configuración de persistencia. Para más información, consulte Configuración de la persistencia de App Fabric.

Antes de usar la característica Almacén de instancias de flujo de trabajo de SQL, cree una base de datos que la característica usará para conservar las instancias de flujo de trabajo. El programa de instalación de .NET Framework 4.6.1 copia los archivos de script de SQL asociados con la característica Almacén de instancias de flujo de trabajo en la carpeta %WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN. Ejecute estos archivos de script en una base de datos de SQL Server 2005 o SQL Server 2008 que desea que el almacén de instancias de flujo de trabajo de SQL use para conservar las instancias de flujo de trabajo. Ejecute primero el archivo SqlWorkflowInstanceStoreSchema.sql y después SqlWorkflowInstanceStoreLogic.sql.

Nota

Para limpiar la base de datos de persistencia para tener una base de datos nueva, ejecute los scripts en %WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN en el siguiente orden.

  1. SqlWorkflowInstanceStoreSchema.sql
  2. SqlWorkflowInstanceStoreLogic.sql

Importante

Si no crea una base de datos de persistencia, la característica Almacén de instancias de flujo de trabajo de SQL inicia una excepción similar a la siguiente cuando un host intenta mantener flujos de trabajo.

System.Data.SqlClient.SqlException: No se pudo encontrar el procedimiento almacenado 'System.Activities.DurableInstancing.CreateLockOwner'

En las siguientes secciones se describe cómo habilitar la persistencia para flujos de trabajo y servicios de flujo de trabajo que usen el almacén de instancias de flujo de trabajo de SQL. Para más información sobre las propiedades del almacén de instancias de flujo de trabajo de SQL, consulte Propiedades del almacén de instancias de flujo de trabajo de SQL.

Habilitación de la persistencia para flujos de trabajo auto-hospedados que usan WorkflowApplication

Puede habilitar la persistencia para los flujos de trabajo auto-hospedados que usen WorkflowApplication mediante programación al utilizar el modelo de objeto SqlWorkflowInstanceStore. El siguiente procedimiento contiene los pasos para hacerlo.

  1. Agregue una referencia a System.Activities.DurableInstancing.dll.

  2. Agregue la siguiente instrucción al principio del archivo de origen después de las instrucciones de uso existentes.

    using System.Activities.DurableInstancing;
    
  3. Construya un objeto SqlWorkflowInstanceStore y asígnelo a la propiedad InstanceStore del objeto WorkflowApplication como se muestra en el código de ejemplo siguiente.

    SqlWorkflowInstanceStore store =
        new SqlWorkflowInstanceStore("Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI");
    
    WorkflowApplication wfApp =
        new WorkflowApplication(new Workflow1());
    
    wfApp.InstanceStore = store;
    

    Nota

    Según la edición de SQL Server, el nombre de servidor de cadena de conexión puede ser diferente.

  4. Invoque el método Persist en el objeto WorkflowApplication para conservar un flujo de trabajo o el método Unload para conservar y descargar un flujo de trabajo. También puede controlar el evento PersistableIdle emitido por el objeto WorkflowApplication y devolver el miembro adecuado (Persist o Unload) de PersistableIdleAction.

    wfApp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
    {
        return PersistableIdleAction.Persist;
    };
    

Nota

Consulte el paso Creación y ejecución de un flujo de trabajo de larga duración del tutorial de introducción para instrucciones detalladas.

Habilitación la persistencia para los servicios del flujo de trabajo auto-hospedados que usan WorkflowServiceHost

Puede habilitar la persistencia para los servicios de flujo de trabajo auto-hospedados que usan WorkflowServiceHost mediante programación al usar la clase SqlWorkflowInstanceStoreBehavior o la clase DurableInstancingOptions.

Uso de la clase SqlWorkflowInstanceStoreBehavior

El siguiente procedimiento detalla los pasos para usar la clase SqlWorkflowInstanceStoreBehavior a fin de habilitar la persistencia para los servicios de flujo de trabajo auto-hospedados.

  1. Agregue una referencia al archivo System.ServiceModel.dll.

  2. Agregue la siguiente instrucción al principio del archivo de origen después de las instrucciones de uso existentes.

    using System.ServiceModel.Activities.Description;
    
  3. Cree una instancia de WorkflowServiceHost y agregue los extremos para el servicio del flujo de trabajo.

    WorkflowServiceHost host = new WorkflowServiceHost(new CountingWorkflow(), new Uri(hostBaseAddress));
    host.AddServiceEndpoint("ICountingWorkflow", new BasicHttpBinding(), "");
    
  4. Construya un objeto SqlWorkflowInstanceStoreBehavior y defina las propiedades del objeto de comportamiento.

    SqlWorkflowInstanceStoreBehavior instanceStoreBehavior = new SqlWorkflowInstanceStoreBehavior(connectionString);
    instanceStoreBehavior.HostLockRenewalPeriod = new TimeSpan(0, 0, 5);
    instanceStoreBehavior.InstanceCompletionAction = InstanceCompletionAction.DeleteAll;
    instanceStoreBehavior.InstanceLockedExceptionAction = InstanceLockedExceptionAction.AggressiveRetry;
    instanceStoreBehavior.InstanceEncodingOption = InstanceEncodingOption.GZip;
    instanceStoreBehavior.RunnableInstancesDetectionPeriod = new TimeSpan("00:00:02");
    host.Description.Behaviors.Add(instanceStoreBehavior);
    
  5. Abra el host de servicio de flujo de trabajo.

    host.Open();
    

Uso de la propiedad DurableInstancingOptions

Cuando se aplica SqlWorkflowInstanceStoreBehavior, DurableInstancingOptions.InstanceStore en WorkflowServiceHost está definida en el objeto SqlWorkflowInstanceStore creado con los valores de configuración. Puede hacer lo mismo mediante programación para definir la propiedad DurableInstancingOptions de WorkflowServiceHost sin usar la clase SqlWorkflowInstanceStoreBehavior, como se muestra en el siguiente código de ejemplo.

workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;

Habilitación de la persistencia para los servicios de flujo de trabajo hospedados en WAS que usan WorkflowServiceHost mediante un archivo de configuración

Puede habilitar la persistencia para los servicios de flujo de trabajo auto-hospedados u hospedados por Windows Process Activation Service (WAS) usando un archivo de configuración. Un servicio de flujo de trabajo hospedado en WAS usa WorkflowServiceHost tal y como lo hacen los servicios de flujo de trabajo auto-hospedados.

SqlWorkflowInstanceStoreBehavior, un comportamiento de servicio que le permite cambiar las propiedades del almacén de instancias de flujo de trabajo de SQL de manera adecuada mediante la configuración XML. En el caso de los servicios de flujo de trabajo hospedados por WAS, use el archivo Web.config. El siguiente ejemplo de configuración muestra cómo configurar el Almacén de instancias de flujo de trabajo de SQL mediante el elemento de comportamiento sqlWorkflowInstanceStore en un archivo de configuración.

<serviceBehaviors>
    <behavior name="">
        <sqlWorkflowInstanceStore
                    connectionString="Data Source=(local);Initial Catalog=DefaultPersistenceProviderDb;Integrated Security=True;Async=true"
                    instanceEncodingOption="GZip | None"
                    instanceCompletionAction="DeleteAll | DeleteNothing"
                    instanceLockedExceptionAction="NoRetry | BasicRetry |AggressiveRetry"
                    hostLockRenewalPeriod="00:00:30"
                    runnableInstancesDetectionPeriod="00:00:05" />

    </behavior>
</serviceBehaviors>

Importante

Microsoft recomienda usar el flujo de autenticación más seguro disponible. Si se conecta a Azure SQL, el método de autenticación recomendado es Identidades administradas para recursos de Azure.

Si no establece los valores para las propiedades connectionString o connectionStringName, el almacén de instancias de flujo de trabajo de SQL usa la cadena de conexión con nombre predeterminada DefaultSqlWorkflowInstanceStoreConnectionString.

Cuando se aplica SqlWorkflowInstanceStoreBehavior, DurableInstancingOptions.InstanceStore en WorkflowServiceHost está definida en el objeto SqlWorkflowInstanceStore creado con los valores de configuración. Puede hacer lo mismo mediante programación para usar SqlWorkflowInstanceStore con WorkflowServiceHost sin usar el elemento de comportamiento del servicio.

workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;

Importante

Se recomienda no almacenar la información confidencial, como nombres de usuario y contraseñas, en el archivo Web.config. Si no almacena información confidencial en el archivo Web.config, debería proteger el acceso al archivo Web.config mediante las lista de control de acceso (ACL) del sistema de archivos. Además, puede proteger los valores de configuración en un archivo de configuración tal como se menciona en Cifrado de la información de configuración mediante la configuración protegida.

La instalación de .NET Framework 4.6.1 agrega el siguiente elemento de extensión de comportamiento al archivo Machine.config para que pueda usar el elemento de comportamiento de servicio <sqlWorkflowInstanceStore> en el archivo de configuración para configurar la persistencia para los servicios.

<configuration>
    <system.serviceModel>
        <extensions>
            <behaviorExtensions>
                <add name="sqlWorkflowInstanceStore" type="System.Activities.DurableInstancing.SqlWorkflowInstanceStoreElement, System.Activities.DurableInstancing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
            </behaviorExtensions>
        </extensions>
    </system.serviceModel>
</configuration>