Compartir a través de


Cómo: Habilitar la persistencia de SQL para flujos de trabajo y servicios de flujo de trabajo

Este tema es aplicable a Windows Workflow Foundation 4.

En este tema 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. 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 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.

Ee395773.note(es-es,VS.100).gifNota:
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

Ee395773.Important(es-es,VS.100).gif Nota:
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 obtener más información sobre las propiedades del almacén de instancias de flujo de trabajo de SQL, vea Propiedades del almacén de instancias de flujo de trabajo de SQL.

Habilitar 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.

Para habilitar la persistencia para los flujos de trabajo auto-hospedados

  1. Agregue una referencia a System.Activites.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;
    
    Ee395773.note(es-es,VS.100).gifNota:
    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;
    };
    
Ee395773.note(es-es,VS.100).gifNota:
Vea el ejemplo de Conservar una aplicación de flujo de trabajo en Persistencia para ver un ejemplo sobre cómo habilitar la persistencia para los flujos de trabajo con SqlWorkflowInstanceStore y el paso Cómo: Crear y ejecutar un flujo de trabajo de larga ejecución de Tutorial de introducción para obtener instrucciones paso a paso.

Habilitar 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.

Usar 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.

Para habilitar la persistencia mediante SqlWorkflowInstanceStoreBehavior

  1. Agregue una referencia a 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();
    
Ee395773.Important(es-es,VS.100).gif Nota:
Vea el ejemplo Configuración integrada en Persistencia para saber cómo habilitar la persistencia para los servicios de flujo de trabajo mediante la clase SqlWorkflowInstanceStoreBehavior.

Usar 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;

Habilitar 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 de 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">

        <sqlWorkflowInstanceStore/>
    </behavior>
</serviceBehaviors>

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;
Ee395773.security(es-es,VS.100).gif Nota: de seguridad
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 y como se menciona en Cifrar información de configuración mediante la configuración protegida.

Elementos Machine.config relacionados con la característica Almacén de instancias de flujo de trabajo de SQL

La instalación de .NET Framework 4 agrega los siguientes elementos relacionados con la característica Almacén de instancias de flujo de trabajo de SQL al archivo Machine.config:

  • 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>