Vorgehensweise: Aktivieren der SQL-Persistenz für Workflows und Workflowdienste

In diesem Thema wird beschrieben, wie Sie die Funktion „SQL-Workflowinstanzspeicher“ konfigurieren, um die Persistenz für Workflows und Workflowdienste sowohl programmgesteuert als auch mithilfe einer Konfigurationsdatei zu aktivieren.

Windows Server AppFabric vereinfacht die Konfiguration von Persistenz. Weitere Informationen finden Sie unter App Fabric-Persistenzkonfiguration.

Erstellen Sie vor dem Verwenden der Funktion „SQL-Workflowinstanzspeicher“ eine Datenbank erstellen, die die Funktion zum Beibehalten von Workflowinstanzen verwendet. Das .NET Framework 4.6.1-Setupprogramm kopiert die SQL-Skriptdateien, die der Funktion „SQL-Workflowinstanzspeicher“ zugeordnet sind, in den Ordner „%WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN“. Führen Sie diese Skriptdateien für eine SQL Server 2005- oder SQL Server 2008-Datenbank aus, die der SQL-Workflowinstanzspeicher zum Beibehalten von Workflowinstanzen verwenden soll. Führen Sie zuerst die Datei "SqlWorkflowInstanceStoreSchema.sql" und dann die Datei "SqlWorkflowInstanceStoreLogic.sql" aus.

Hinweis

Um die Persistenzdatenbank so zu bereinigen, dass sie eine neue Datenbank aufweist, führen Sie die Skripts in "%WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN" in der folgenden Reihenfolge aus.

  1. SqlWorkflowInstanceStoreSchema.sql
  2. SqlWorkflowInstanceStoreLogic.sql

Wichtig

Wenn Sie keine Persistenzdatenbank erstellen, löst die Funktion "SQL-Workflowinstanzspeicher" eine Ausnahme wie unten angegeben aus, sobald ein Host versucht, Workflows beizubehalten.

System.Data.SqlClient.SqlException: Die gespeicherte Prozedur "System.Activities.DurableInstancing.CreateLockOwner" wurde nicht gefunden.

In den folgenden Abschnitten wird beschrieben, wie Sie die Persistenz für Workflows und Workflowdienste mithilfe des SQL-Workflowinstanzspeichers aktivieren. Weitere Informationen zu den Eigenschaften des SQL-Workflowinstanzspeichers finden Sie unter Eigenschaften des SQL-Workflowinstanzspeichers.

Aktivieren der Persistenz für selbst gehostete Workflows, die WorkflowApplication verwenden

Sie können die Persistenz für selbst gehostete Workflows aktivieren, die WorkflowApplication programmgesteuert nutzen, indem Sie das SqlWorkflowInstanceStore-Objektmodell verwenden. Die folgende Vorgehensweise enthält die dafür erforderlichen Schritte.

So aktivieren Sie Persistenz für selbst gehostete Workflows

  1. Fügen Sie einen Verweis zu „System.Activities.DurableInstancing.dll“ hinzu.

  2. Fügen Sie oben in der Quelldatei nach den vorhandenen using-Anweisungen die folgende Anweisung hinzu.

    using System.Activities.DurableInstancing;
    
  3. Erstellen Sie einen SqlWorkflowInstanceStore, und weisen Sie ihn demInstanceStore der WorkflowApplication wie im folgenden Codebeispiel dargestellt zu.

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

    Hinweis

    Abhängig von der SQL Server-Version kann der Servername der Verbindungszeichenfolge abweichen.

  4. Rufen Sie die Persist-Methode für das WorkflowApplication-Objekt auf, um einen Workflow beizubehalten, oder die Unload-Methode, um einen Workflow beizubehalten und zu entladen. Sie können auch das vom PersistableIdle-Objekt ausgelöste WorkflowApplication-Ereignis behandeln und den entsprechenden Member (Persist oder Unload) von PersistableIdleAction zurückgeben.

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

Aktivieren der Persistenz für selbst gehostete Workflowdienste, die WorkflowServiceHost verwenden

Sie können die Persistenz für selbst gehostete Workflowdienste, die WorkflowServiceHost verwenden, mithilfe der SqlWorkflowInstanceStoreBehavior-Klasse oder der DurableInstancingOptions-Klasse programmgesteuert aktivieren.

Verwenden der SqlWorkflowInstanceStoreBehavior-Klasse

Die folgende Vorgehensweise enthält Schritte zum Verwenden der SqlWorkflowInstanceStoreBehavior-Klasse zur Aktivierung der Persistenz für selbst gehostete Workflowdienste.

So aktivieren Sie die Persistenz mit SqlWorkflowInstanceStoreBehavior

  1. Fügen Sie einen Verweis zu "System.ServiceModel.dll" hinzu.

  2. Fügen Sie oben in der Quelldatei nach den vorhandenen using-Anweisungen die folgende Anweisung hinzu.

    using System.ServiceModel.Activities.Description;
    
  3. Erstellen Sie eine Instanz von WorkflowServiceHost, und fügen Sie Endpunkte für den Workflowdienst hinzu.

    WorkflowServiceHost host = new WorkflowServiceHost(new CountingWorkflow(), new Uri(hostBaseAddress));
    host.AddServiceEndpoint("ICountingWorkflow", new BasicHttpBinding(), "");
    
  4. Erstellen Sie ein SqlWorkflowInstanceStoreBehavior-Objekt, und legen Sie Eigenschaften des Verhaltensobjekts fest.

    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. Öffnen Sie den Workflowdiensthost.

    host.Open();
    

Verwenden der DurableInstancingOptions-Eigenschaft

Wenn SqlWorkflowInstanceStoreBehavior angewendet wird, wird DurableInstancingOptions.InstanceStore auf dem WorkflowServiceHost auf das SqlWorkflowInstanceStore-Element festgelegt, das anhand der Konfigurationswerte erstellt wurde. Dies können Sie auch programmgesteuert erreichen, um die DurableInstancingOptions-Eigenschaft von WorkflowServiceHost ohne Verwendung der SqlWorkflowInstanceStoreBehavior-Klasse festzulegen, wie im folgenden Codebeispiel dargestellt.

workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;

Aktivieren der Persistenz für per WAS gehostete Workflowdienste, die WorkflowServiceHost verwenden, mithilfe einer Konfigurationsdatei

Sie können die Persistenz für selbst gehostete oder per WAS (Windows Process Activation Service) gehostete Workflowdienste mithilfe einer Konfigurationsdatei aktivieren. Ein per WAS gehosteter Workflowdienst verwendet WorkflowServiceHost, wie selbst gehostete Workflowdienste dies auch tun.

SqlWorkflowInstanceStoreBehavior ist ein Dienstverhalten, mit dem Sie die Eigenschaften von SQL-Workflowinstanzspeicher mithilfe der XML-Konfiguration auf einfache Weise ändern können. Verwenden Sie für per WAS gehostete Workflowdienste die Datei "Web.config". Im folgenden Konfigurationsbeispiel wird gezeigt, wie Sie den SQL-Workflowinstanzspeicher konfigurieren, indem Sie das sqlWorkflowInstanceStore-Verhaltenselement in einer Konfigurationsdatei verwenden.

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

Falls Sie keine Werte für die connectionString- oder connectionStringName-Eigenschaft festlegen, verwendet der SQL-Workflowinstanzspeicher die standardmäßige Verbindungszeichenfolge DefaultSqlWorkflowInstanceStoreConnectionString.

Wenn SqlWorkflowInstanceStoreBehavior angewendet wird, wird DurableInstancingOptions.InstanceStore auf dem WorkflowServiceHost auf das SqlWorkflowInstanceStore-Element festgelegt, das anhand der Konfigurationswerte erstellt wurde. Dies können Sie auch programmgesteuert erreichen, indem Sie SqlWorkflowInstanceStore mit WorkflowServiceHost und ohne das Dienstverhaltenelement verwenden.

workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;

Wichtig

Es wird empfohlen, keine vertraulichen Informationen wie Benutzernamen und Kennwörter in der Datei "Web.config" zu speichern. Wenn Sie vertrauliche Informationen in der Datei "Web.config" speichern, sollten Sie den Zugriff auf die Datei "Web.config" mit Dateisystem-ACLs (Zugriffssteuerungslisten) sichern. Außerdem können Sie die Konfigurationswerte innerhalb einer Konfigurationsdatei auch gemäß der Beschreibung unter Verschlüsseln von Konfigurationsinformationen mithilfe der geschützten Konfiguration sichern.

Die .NET Framework 4.6.1-Installation fügt die folgenden Elemente, die sich auf die Funktion „SQL-Workflowinstanzspeicher“ beziehen, der Datei „Machine.config“ hinzu:

  • Fügt der Datei „Machine.config“ das folgende Verhaltenserweiterungselement hinzu, damit Sie das <sqlWorkflowInstanceStore>-Dienstverhaltenelement in der Konfigurationsdatei verwenden können, um die Persistenz für die Dienste zu konfigurieren.

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