Partilhar via


Como habilitar a persistência SQL para fluxos de trabalho e serviços de fluxo de trabalho

Este artigo descreve como configurar o recurso Repositório de Instâncias de Fluxo de Trabalho SQL para habilitar a persistência para seus fluxos de trabalho e serviços de fluxo de trabalho programaticamente e usando um arquivo de configuração.

O Windows Server App Fabric simplifica o processo de configuração da persistência. Para obter mais informações, consulte Configuração de persistência do App Fabric.

Antes de usar o recurso Repositório de Instâncias de Fluxo de Trabalho SQL, crie um banco de dados que o recurso usa para persistir instâncias de fluxo de trabalho. O programa de instalação do .NET Framework 4.6.1 copia arquivos de script SQL associados ao recurso SQL Workflow Instance Store para a pasta %WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN. Execute esses arquivos de script em um banco de dados SQL Server 2005 ou SQL Server 2008 que você deseja que o Repositório de Instâncias de Fluxo de Trabalho SQL use para persistir instâncias de fluxo de trabalho. Execute o arquivo SqlWorkflowInstanceStoreSchema.sql primeiro e, em seguida, execute o arquivo SqlWorkflowInstanceStoreLogic.sql.

Nota

Para limpar o banco de dados de persistência para ter um novo banco de dados, execute os scripts em %WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN na seguinte ordem.

  1. SqlWorkflowInstanceStoreSchema.sql
  2. SqlWorkflowInstanceStoreLogic.sql

Importante

Se você não criar um banco de dados de persistência, o recurso Repositório de Instâncias de Fluxo de Trabalho SQL lançará uma exceção semelhante à seguinte quando um host tentar persistir fluxos de trabalho.

System.Data.SqlClient.SqlException: Não foi possível encontrar o procedimento armazenado 'System.Activities.DurableInstancing.CreateLockOwner'

As seções a seguir descrevem como habilitar a persistência para fluxos de trabalho e serviços de fluxo de trabalho usando o Repositório de Instâncias de Fluxo de Trabalho SQL. Para obter mais informações sobre as propriedades do Repositório de Instâncias do Fluxo de Trabalho SQL, consulte Propriedades do Repositório de Instâncias do Fluxo de Trabalho SQL.

Habilite a persistência para fluxos de trabalho auto-hospedados que usam WorkflowApplication

Você pode habilitar a persistência para fluxos de trabalho auto-hospedados que usam WorkflowApplication programaticamente usando o modelo de SqlWorkflowInstanceStore objeto. O procedimento a seguir contém etapas para fazer isso.

  1. Adicione uma referência a System.Activities.DurableInstancing.dll.

  2. Adicione a seguinte instrução na parte superior do arquivo de origem após as instruções "using" existentes.

    using System.Activities.DurableInstancing;
    
  3. Construa um SqlWorkflowInstanceStore e atribua-o InstanceStore WorkflowApplication ao do como mostrado no exemplo de código a seguir.

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

    Nota

    Dependendo da sua edição do SQL Server, o nome do servidor da cadeia de conexão pode ser diferente.

  4. Invoque o Persist WorkflowApplication método no objeto para persistir um fluxo de trabalho ou Unload método para persistir e descarregar um fluxo de trabalho. Você também pode manipular o PersistableIdle evento gerado pelo WorkflowApplication objeto e retornar o membro apropriado (Persist ou Unload) do PersistableIdleAction.

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

Nota

Consulte a etapa Como: Criar e executar um fluxo de trabalho de longa execução do Tutorial de introdução para obter instruções passo a passo.

Habilite a persistência para serviços de fluxo de trabalho auto-hospedados que usam o WorkflowServiceHost

Você pode habilitar a persistência para serviços de fluxo de trabalho auto-hospedados que usam WorkflowServiceHost programaticamente usando a SqlWorkflowInstanceStoreBehavior classe ou a DurableInstancingOptions classe.

Use a classe SqlWorkflowInstanceStoreBehavior

O procedimento a seguir contém etapas para usar a classe para habilitar a SqlWorkflowInstanceStoreBehavior persistência para serviços de fluxo de trabalho auto-hospedados.

  1. Adicione uma referência a System.ServiceModel.dll.

  2. Adicione a seguinte instrução na parte superior do arquivo de origem após as instruções "using" existentes.

    using System.ServiceModel.Activities.Description;
    
  3. Crie uma instância do WorkflowServiceHost e adicione pontos de extremidade para o serviço de fluxo de trabalho.

    WorkflowServiceHost host = new WorkflowServiceHost(new CountingWorkflow(), new Uri(hostBaseAddress));
    host.AddServiceEndpoint("ICountingWorkflow", new BasicHttpBinding(), "");
    
  4. Construa um SqlWorkflowInstanceStoreBehavior objeto e defina as propriedades do objeto de 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. Abra o host do serviço de fluxo de trabalho.

    host.Open();
    

Use a propriedade DurableInstancingOptions

Quando o SqlWorkflowInstanceStoreBehavior é aplicado, o DurableInstancingOptions.InstanceStore on é WorkflowServiceHost definido como o SqlWorkflowInstanceStore objeto criado usando os valores de configuração. Você pode fazer o mesmo programaticamente para definir a DurableInstancingOptions propriedade do sem usar a SqlWorkflowInstanceStoreBehavior classe, WorkflowServiceHost conforme mostrado no exemplo de código a seguir.

workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;

Habilite a persistência para serviços de fluxo de trabalho hospedados pelo WAS que usam o WorkflowServiceHost usando um arquivo de configuração

Você pode habilitar a persistência para serviços de fluxo de trabalho auto-hospedados ou hospedados pelo Serviço de Ativação de Processos do Windows (WAS) usando um arquivo de configuração. Um serviço de fluxo de trabalho hospedado pelo WAS usa o WorkflowServiceHost como os serviços de fluxo de trabalho auto-hospedados.

O SqlWorkflowInstanceStoreBehavior, um comportamento de serviço que permite alterar convenientemente as propriedades do Repositório de Instâncias do Fluxo de Trabalho SQL por meio da configuração XML. Para serviços de fluxo de trabalho hospedados pelo WAS, use o arquivo Web.config. O exemplo de configuração a seguir mostra como configurar o Repositório de Instâncias do Fluxo de Trabalho SQL usando o sqlWorkflowInstanceStore elemento behavior em um arquivo de configuração.

<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

A Microsoft recomenda que você use o fluxo de autenticação mais seguro disponível. Se você estiver se conectando ao SQL do Azure, as Identidades Gerenciadas para recursos do Azure serão o método de autenticação recomendado.

Se você não definir valores para a connectionString ou a connectionStringName propriedade, o Repositório de Instâncias do Fluxo de Trabalho SQL usará a cadeia de DefaultSqlWorkflowInstanceStoreConnectionStringconexão nomeada padrão .

Quando o SqlWorkflowInstanceStoreBehavior é aplicado, o DurableInstancingOptions.InstanceStore on é WorkflowServiceHost definido como o SqlWorkflowInstanceStore objeto criado usando os valores de configuração. Você pode fazer o mesmo programaticamente para usar o SqlWorkflowInstanceStore com WorkflowServiceHost sem usar o elemento de comportamento de serviço.

workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;

Importante

É recomendável que você não armazene informações confidenciais, como nomes de usuário e senhas, no arquivo Web.config. Se você armazenar informações confidenciais no arquivo Web.config, deverá proteger o acesso ao arquivo Web.config usando ACLs (Listas de Controle de Acesso) do sistema de arquivos. Além disso, você também pode proteger os valores de configuração dentro de um arquivo de configuração, conforme mencionado em Criptografando informações de configuração usando a configuração protegida.

A instalação do .NET Framework 4.6.1 adiciona o seguinte elemento de extensão de comportamento ao arquivo Machine.config para que você possa usar o <sqlWorkflowInstanceStore> elemento de comportamento de serviço no arquivo de configuração para configurar a persistência para seus serviços.

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