共用方式為


作法:啟用工作流程與工作流程服務的 SQL 持續性

本文描述如何設定 SQL 工作流程執行個體存放區功能,以程式設計方式或使用組態檔來啟用工作流程與工作流程服務的持續性。

Windows Server App Fabric 會簡化設定持續性的程序。 如需詳細資訊,請參閱持續性組態

使用 SQL 工作流程執行個體存放區功能之前,請建立一個讓此功能用於保存工作流程執行個體的資料庫。 .NET Framework 4.6.1 安裝程式會將與 SQL 工作流程執行個體存放區功能相關聯的 SQL 指令碼檔複製至 %WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN 資料夾。 針對 SQL Server 2005 或 SQL Server 2008 資料庫執行這些指令碼檔,且這個資料庫可供 SQL 工作流程執行個體存放區用來保存工作流程執行個體。 先執行 SqlWorkflowInstanceStoreSchema.sql 檔,然後再執行 SqlWorkflowInstanceStoreLogic.sql 檔。

注意

若要清除持續性資料庫來擁有乾淨的資料庫,請依照下列順序執行 %WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN 中的指令碼。

  1. SqlWorkflowInstanceStoreSchema.sql
  2. SqlWorkflowInstanceStoreLogic.sql

重要

如果您並未建立持續性資料庫,則當主機嘗試保存工作流程時,SQL 工作流程執行個體存放區功能就會擲回與下列其中一個相似的例外狀況。

System.Data.SqlClient.SqlException:找不到預存程序 'System.Activities.DurableInstancing.CreateLockOwner'

下列各節描述如何使用 SQL 工作流程執行個體存放區啟用工作流程與工作流程服務的持續性。 如需 SQL 工作流程執行個體存放區屬性的詳細資訊,請參閱 SQL 工作流程執行個體存放區的屬性

啟用使用 WorkflowApplication 之自我裝載工作流程的持續性

您可以使用 WorkflowApplication 物件模型,以程式設計方式啟用使用 SqlWorkflowInstanceStore 之自我裝載工作流程的持續性。 下列程序包含執行此作業的步驟。

  1. 將參考加入至 System.Activities.DurableInstancing.dll。

  2. 在原始程式檔最上方現有的 "using" 陳述式後方,加入下列陳述式。

    using System.Activities.DurableInstancing;
    
  3. 建構 SqlWorkflowInstanceStore 並將它指派給 InstanceStoreWorkflowApplication,如下列程式碼範例所示。

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

    注意

    依據您的 SQL Server 版本,連接字串伺服器名稱可能有所不同。

  4. 叫用 Persist 物件上的 WorkflowApplication 方法以保存工作流程,或叫用 Unload 以保存及卸載工作流程。 您也可以處理由 PersistableIdle 物件引發的 WorkflowApplication 事件,並傳回 Persist 的適當 (UnloadPersistableIdleAction) 成員。

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

注意

如需逐步指示,請參閱快速入門教學課程如何建立和執行長時間執行的工作流程步驟。

啟用使用 WorkflowServiceHost 之自我裝載工作流程服務的持續性

您可以使用 WorkflowServiceHost 類別或 SqlWorkflowInstanceStoreBehavior 類別,啟用以程式設計方式使用 DurableInstancingOptions 之自我裝載工作流程服務的持續性。

使用 SqlWorkflowInstanceStoreBehavior 類別

以下程序包含使用 SqlWorkflowInstanceStoreBehavior 類別以啟用自我裝載工作流程服務之持續性的步驟。

  1. 加入 System.ServiceModel.dll 的參考。

  2. 在原始程式檔最上方現有的 "using" 陳述式後方,加入下列陳述式。

    using System.ServiceModel.Activities.Description;
    
  3. 建立 WorkflowServiceHost 的執行個體,並加入工作流程服務的端點。

    WorkflowServiceHost host = new WorkflowServiceHost(new CountingWorkflow(), new Uri(hostBaseAddress));
    host.AddServiceEndpoint("ICountingWorkflow", new BasicHttpBinding(), "");
    
  4. 建構 SqlWorkflowInstanceStoreBehavior 物件並設定該行為物件的屬性。

    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. 開啟工作流程服務主機。

    host.Open();
    

使用 DurableInstancingOptions 屬性

當套用 SqlWorkflowInstanceStoreBehavior 時,會將 DurableInstancingOptions.InstanceStore 上的 WorkflowServiceHost 設定為使用組態值建立的 SqlWorkflowInstanceStore 物件。 您同樣可以使用程式設計方式,在不必使用 DurableInstancingOptions 類別的情況下,設定 WorkflowServiceHostSqlWorkflowInstanceStoreBehavior 屬性,如下列程式碼範例所示。

workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;

使用組態檔啟用使用 WorkflowServiceHost 之 WAS 裝載工作流程服務的持續性

您可以使用組態檔,啟用自我裝載或 Windows Process Activation Service (WAS) 裝載之工作流程服務的持續性。 WAS 裝載的工作流程服務會使用 WorkflowServiceHost,如同自我裝載的工作流程服務一樣。

SqlWorkflowInstanceStoreBehavior 為服務行為,可透過 XML 組態來方便地變更 SQL 工作流程執行個體存放區屬性。 如果是 WAS 裝載的工作流程服務,請使用 Web.config 檔。 下列組態範例示範如何使用組態檔中的 sqlWorkflowInstanceStore 行為項目來設定 SQL 工作流程執行個體存放區。

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

重要

Microsoft建議您使用可用的最安全驗證流程。 如果您要連接到 Azure SQL,Azure 資源受控識別是建議的驗證方法。

如果您並未設定 connectionStringconnectionStringName 屬性的值,SQL 工作流程執行個體存放區就會使用預設命名的連接字串 DefaultSqlWorkflowInstanceStoreConnectionString

當套用 SqlWorkflowInstanceStoreBehavior 時,會將 DurableInstancingOptions.InstanceStore 上的 WorkflowServiceHost 設定為使用組態值建立的 SqlWorkflowInstanceStore 物件。 您同樣可以使用程式設計方式,在不必使用服務行為項目的情況下,搭配 SqlWorkflowInstanceStore 來使用 WorkflowServiceHost

workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;

重要

建議您不要將敏感資訊 (例如,使用者名稱和密碼) 儲存在 Web.config 檔案中。 如果要將敏感資訊儲存在 Web.config 檔案中,則應使用檔案系統存取控制清單 (ACL) 來保護存取 Web.config 檔的安全性。 此外,也可以如使用受保護的組態加密組態資訊 (Encrypting Configuration Information Using Protected Configuration) 所述,保護組態檔內組態值的安全性。

.NET Framework 4.6.1 安裝將以下行為延伸項目加入至 Machine.config 檔,這樣您就可以使用組態檔中的 <sqlWorkflowInstanceStore> 服務行為項目來設定服務的持續性。

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