Procedura: abilitare la persistenza SQL per i flussi di lavoro e i relativi servizi

In questo argomento viene descritto come configurare la funzionalità di archivio di istanze del flusso di lavoro SQL per abilitare la persistenza per i flussi di lavoro e i relativi servizi sia a livello di codice sia tramite un file di configurazione.

Windows Server AppFabric semplifica il processo di configurazione della persistenza. Per altre informazioni, vedere Configurazione del salvataggio permanente di App Fabric.

Prima di usare tale funzionalità, creare un database usato dalla funzionalità per rendere persistenti le istanze del flusso di lavoro. Il programma di installazione di .NET Framework 4.6.1 copia i file di script SQL associati alla funzionalità di archivio di istanze del flusso di lavoro SQL nella cartella %WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN. Eseguire questi file di script in un database di SQL Server 2005 o SQL Server 2008 che si desidera venga usato dall'archivio di istanze del flusso di lavoro SQL per rendere persistenti le istanze del flusso di lavoro. Eseguire innanzitutto il file SqlWorkflowInstanceStoreSchema.sql, quindi il file SqlWorkflowInstanceStoreLogic.sql.

Nota

Per pulire il database di persistenza per avere un database aggiornato, eseguire gli script in %WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN nell'ordine seguente.

  1. SqlWorkflowInstanceStoreSchema.sql
  2. SqlWorkflowInstanceStoreLogic.sql

Importante

Se non si crea un database di persistenza, la funzionalità di archivio di istanze del flusso di lavoro SQL genera un'eccezione simile alla seguente quando un host tenta di rendere persistenti i flussi di lavoro.

System.Data.SqlClient.SqlException: Impossibile trovare la stored procedure 'System.Activities.DurableInstancing.CreateLockOwner'

Nelle sezioni seguenti viene descritto come abilitare la persistenza per i flussi di lavoro e i relativi servizi usando l'archivio di istanze del flusso di lavoro SQL. Per altre informazioni sulle proprietà dell'archivio di istanze del flusso di lavoro SQL, vedere Proprietà dell'archivio di istanze del flusso di lavoro SQL.

Abilitazione della persistenza per i flussi di lavoro indipendenti che usano l'oggetto WorkflowApplication

È possibile abilitare la persistenza per i flussi di lavoro indipendenti che usano l'oggetto WorkflowApplication a livello di codice tramite il modello a oggetti SqlWorkflowInstanceStore. Nella procedura seguente sono inclusi i passaggi per eseguire questa operazione.

Per abilitare la persistenza per i flussi di lavoro indipendenti

  1. Aggiungere un riferimento a System.Activites.DurableInstancing.dll.

  2. Aggiungere l'istruzione seguente all'inizio del file di origine dopo le istruzioni "using" esistenti.

    using System.Activities.DurableInstancing;
    
  3. Costruire un oggetto SqlWorkflowInstanceStore e assegnarlo alla proprietà InstanceStore dell'oggetto WorkflowApplication come mostrato nell'esempio di codice seguente.

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

    Nota

    Il nome del server della stringa di connessione potrebbe essere diverso a seconda dell'edizione di SQL Server.

  4. Richiamare il metodo Persist sull'oggetto WorkflowApplication per rendere persistente un flusso di lavoro o il metodo Unload per rendere persistente e scaricare un flusso di lavoro. È anche possibile gestire l'evento PersistableIdle generato dall'oggetto WorkflowApplication e restituire il membro (Persist o Unload) appropriato dell'oggetto PersistableIdleAction.

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

Abilitazione della persistenza per i servizi flussi di lavoro indipendenti che usano l'oggetto WorkflowServiceHost

È possibile abilitare la persistenza per i servizi flussi di lavoro indipendenti che usano l'oggetto WorkflowServiceHost a livello di codice tramite la classe SqlWorkflowInstanceStoreBehavior o DurableInstancingOptions.

Utilizzo della classe SqlWorkflowInstanceStoreBehavior

Nella procedura seguente sono contenuti i passaggi per usare la classe SqlWorkflowInstanceStoreBehavior al fine di abilitare la persistenza per i servizi flussi di lavoro indipendenti.

Per abilitare la persistenza tramite l'oggetto SqlWorkflowInstanceStoreBehavior

  1. Aggiungere un riferimento a System.ServiceModel.dll.

  2. Aggiungere l'istruzione seguente all'inizio del file di origine dopo le istruzioni "using" esistenti.

    using System.ServiceModel.Activities.Description;
    
  3. Creare un'istanza dell'oggetto WorkflowServiceHost e aggiungere gli endpoint per il servizio flusso di lavoro.

    WorkflowServiceHost host = new WorkflowServiceHost(new CountingWorkflow(), new Uri(hostBaseAddress));
    host.AddServiceEndpoint("ICountingWorkflow", new BasicHttpBinding(), "");
    
  4. Costruire un oggetto SqlWorkflowInstanceStoreBehavior e impostare le proprietà dell'oggetto di comportamento.

    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. Aprire l'host del servizio flusso di lavoro.

    host.Open();
    

Utilizzo della proprietà DurableInstancingOptions

Quando l'oggetto SqlWorkflowInstanceStoreBehavior è applicato, l'oggetto DurableInstancingOptions.InstanceStore in WorkflowServiceHost viene impostato sull'oggetto SqlWorkflowInstanceStore creato usando i valori di configurazione. Tale operazione può essere eseguita anche a livello di codice per impostare la proprietà DurableInstancingOptions dell'oggetto WorkflowServiceHost senza usare la classe SqlWorkflowInstanceStoreBehavior come mostrato nell'esempio di codice seguente.

workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;

Abilitazione della persistenza per i servizi flussi di lavoro ospitati nel servizio WAS che usano l'oggetto WorkflowServiceHost tramite un file di configurazione

È possibile abilitare la persistenza per i servizi flussi di lavori indipendenti oppure ospitati nel servizio WAS tramite un file di configurazione. Un servizio flusso di lavoro ospitato nel servizio WAS usa l'oggetto WorkflowServiceHost come servizi flussi di lavoro indipendenti.

L'oggetto SqlWorkflowInstanceStoreBehavior è un comportamento del servizio che consente di modificare facilmente le proprietà dell'archivio di istanze del flusso di lavoro SQL tramite la configurazione XML. Per i servizi flussi di lavoro ospitati nel servizio WAS, usare il file Web.config. Nell'esempio di configurazione seguente viene mostrato come configurare l'archivio di istanze del flusso di lavoro SQL tramite l'elemento del comportamento sqlWorkflowInstanceStore in un file di configurazione.

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

Se non si impostano i valori per la proprietà connectionString o connectionStringName, l'archivio di istanze del flusso di lavoro SQL usa la stringa di connessione predefinita denominata DefaultSqlWorkflowInstanceStoreConnectionString.

Quando l'oggetto SqlWorkflowInstanceStoreBehavior è applicato, l'oggetto DurableInstancingOptions.InstanceStore in WorkflowServiceHost viene impostato sull'oggetto SqlWorkflowInstanceStore creato usando i valori di configurazione. Tale operazione può essere eseguita anche a livello di codice per usare l'oggetto SqlWorkflowInstanceStore con l'oggetto WorkflowServiceHost senza usare l'elemento del comportamento del servizio.

workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;

Importante

È consigliabile non archiviare nel file Web.config informazioni riservate, quali nomi utente e password. In caso contrario, è necessario proteggere l'accesso a tale file tramite gli elenchi di controllo di accesso (ACL) del file system. Inoltre, è anche possibile proteggere i valori di configurazione all'interno di un file di configurazione come illustrato in Crittografia delle informazioni di configurazione utilizzando la configurazione protetta.

L'installazione di .NET Framework 4.6.1 comporta l'aggiunta degli elementi seguenti correlati alla funzionalità di archivio di istanze del flusso di lavoro SQL al file Machine.config:

  • Aggiunge il seguente elemento di estensione del comportamento al file Machine.config in modo da poter usare l'elemento del comportamento del servizio <sqlWorkflowInstanceStore> nel file di configurazione per configurare il salvataggio permanente per i servizi.

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