使用 WorkflowIdentity 與版本控制

WorkflowIdentity 提供一種方法,讓工作流程應用程式開發人員能夠將名稱和 Version 與工作流程定義建立關聯,並為這項資訊與持續性的工作流程執行個體建立關聯。 此身分識別資訊可由工作流程應用程式開發人員使用以啟用案例 (例如並存執行多個版本的工作流程定義),以及提供動態更新等其他功能的基礎。 本主題提供使用 WorkflowIdentity 搭配 WorkflowApplication 裝載的概觀。 如需在工作流程服務中並存執行工作流程定義的詳細資訊,請參閱 WorkflowServiceHost 中的並存版本控制。 如需動態更新的詳細資訊,請參閱 動態更新

本主題內容

使用 WorkflowIdentity

若要使用 WorkflowIdentity,請建立執行個體、加以設定,並將其與 WorkflowApplication 執行個體建立關聯。 WorkflowIdentity 執行個體包含三項識別資訊。 NameVersion 包含名稱及 Version,兩者都是必要項,而 Package 則是選用項,可用來指定包含資訊 (例如組件名稱或其他所需資訊) 的其他字串。 如果 WorkflowIdentity 的三個屬性中有任何屬性與另一個 WorkflowIdentity 的不同,則其為唯一識別。

重要

WorkflowIdentity 不應包含任何個人可識別資訊 (PII)。 執行階段會在數個不同的活動生命週期點,將有關WorkflowIdentity (用來建立執行個體) 的資訊發出到任何已設定的追蹤服務。 WF 追蹤沒有任何機制可隱藏 PII (機密的使用者資料)。 因此,WorkflowIdentity 執行個體不應包含任何 PII 資料,因為執行階段會在追蹤記錄中發出這項資訊,因此存取檢視追蹤記錄的人有可能看見這項資訊。

在下列範例中,建立了 WorkflowIdentity,並將其與使用 MortgageWorkflow 工作流程定義來建立的工作流程執行個體建立關聯。

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

重新載入並繼續工作流程時,所使用的 WorkflowIdentity 必須設定為符合持續性工作流程執行個體的 WorkflowIdentity

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the workflow.
wfApp.Load(instanceId);

// Resume the workflow...

如果在重新載入工作流程執行個體時,使用的 WorkflowIdentity 與持續性 WorkflowIdentity 不相符,會擲回 VersionMismatchException。 在下列範例中,會在上一個範例中持續性 MortgageWorkflow 執行個體上載入。 這個載入嘗試是使用針對較新版抵押工作流程設定的 WorkflowIdentity,該工作流程與持續性執行個體不相符。

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow_v2(), identityV2);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Attempt to load the workflow instance.
wfApp.Load(instanceId);

// Resume the workflow...

執行先前的程式碼時,會擲回 VersionMismatchException

The WorkflowIdentity ('MortgageWorkflow v1; Version=1.0.0.0') of the loaded instance does not match the WorkflowIdentity ('MortgageWorkflow v2; Version=2.0.0.0') of the provided workflow definition. The instance can be loaded using a different definition, or updated using Dynamic Update.

使用 WorkflowIdentity 的並存執行

WorkflowIdentity 可加速並存執行多種版本的工作流程。 常見的案例之一是變更長時間執行工作流程的業務需求。 部署更新版本時,可以執行同一個工作流程的多個執行個體。 主應用程式可以設定為在啟動新執行個體時使用更新的工作流程定義,而且主應用程式必須在繼續執行個體時,負責提供正確的工作流程定義。 WorkflowIdentity 可以在繼續工作流程執行個體時識別和提供相符的工作流程定義。

為了擷取持續性工作流程執行個體的 WorkflowIdentity,會使用 GetInstance 方法。 GetInstance 方法會採用持續性工作流程執行個體的 Id 及包含持續性執行個體的 SqlWorkflowInstanceStore,並且傳回 WorkflowApplicationInstanceWorkflowApplicationInstance 包含持續性工作流程執行個體的相關資訊,包括與其相關聯的 WorkflowIdentity。 載入及繼續工作流程執行個體時,主機可以使用此相關聯的 WorkflowIdentity 來提供正確的工作流程定義。

注意

Null WorkflowIdentity 為有效,而且可讓主機用來將沒有相關聯 WorkflowIdentity 的持續性執行個體,對應至適當的工作流程定義。 當工作流程應用程式一開始未以工作流程版本設定,或從 .NET Framework 4 升級應用程式時,就可能會發生此情況。 如需詳細資訊,請參閱 升級 .NET Framework 4 持續性資料庫以支援工作流程版本控制

在下列範例中 Dictionary<WorkflowIdentity, Activity> ,是用來將 WorkflowIdentity 實例與其相符的工作流程定義建立關聯,並使用 MortgageWorkflow 與相關聯的工作流程定義來啟動工作流程 identityV1 WorkflowIdentity

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowIdentity identityV2 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v2",
    Version = new Version(2, 0, 0, 0)
};

Dictionary<WorkflowIdentity, Activity> WorkflowVersionMap = new Dictionary<WorkflowIdentity, Activity>();
WorkflowVersionMap.Add(identityV1, new MortgageWorkflow());
WorkflowVersionMap.Add(identityV2, new MortgageWorkflow_v2());

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

在下列範例中,會呼叫 GetInstance,以從上一個範例擷取持續性工作流程執行個體的相關資訊,並使用持續性 WorkflowIdentity 資訊來擷取相符的工作流程定義。 此資訊可用來設定 WorkflowApplication,然後載入工作流程。 請注意,因為使用 LoadWorkflowApplicationInstance 多載,SqlWorkflowInstanceStore 會使用在 WorkflowApplicationInstance 上設定的 WorkflowApplication,因此不需設定其 InstanceStore 屬性。

注意

如果設定了InstanceStore 屬性,必須以 SqlWorkflowInstanceStore 使用的同一個 WorkflowApplicationInstance 執行個體進行設定,否則會擲回 ArgumentException,並出現下列訊息:The instance is configured with a different InstanceStore than this WorkflowApplication.

// Get the WorkflowApplicationInstance of the desired workflow from the specified
// SqlWorkflowInstanceStore.
WorkflowApplicationInstance instance = WorkflowApplication.GetInstance(instanceId, store);

// Use the persisted WorkflowIdentity to retrieve the correct workflow
// definition from the dictionary.
Activity definition = WorkflowVersionMap[instance.DefinitionIdentity];

WorkflowApplication wfApp = new WorkflowApplication(definition, instance.DefinitionIdentity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the persisted workflow instance.
wfApp.Load(instance);

// Resume the workflow...

升級 .NET Framework 4 持續性資料庫以支援工作流程版本控制

Sqlworkflowinstancestoreschemaupgrade.sql 會提供 sql database 腳本來升級使用 .NET Framework 4 資料庫腳本所建立的持續性資料庫。 此腳本會更新資料庫,以支援 .NET Framework 4.5 中引進的新版本控制功能。 資料庫中的任何持續性工作流程執行個體,都會有版本控制預設值,並可以參與並存執行和動態更新。

如果 .NET Framework 4.5 工作流程應用程式嘗試在未使用提供的腳本進行升級的持續性資料庫上使用新版本控制功能的任何持續性作業,會擲回, InstancePersistenceCommandException 並出現類似下列訊息的訊息。

The SqlWorkflowInstanceStore has a database version of '4.0.0.0'. InstancePersistenceCommand 'System.Activities.DurableInstancing.CreateWorkflowOwnerWithIdentityCommand' cannot be run against this database version.  Please upgrade the database to '4.5.0.0'.

升級資料庫架構

  1. 開啟 SQL Server Management Studio 並連接至持續性資料庫伺服器,例如 .\SQLEXPRESS

  2. 選擇 [檔案] 功能表中的 [開啟 ]、[ 檔案]。 瀏覽至下列資料夾:C:\Windows\Microsoft.NET\Framework\v4.0.30319\sql\en

  3. 選取 [sqlworkflowinstancestoreschemaupgrade.sql ],然後按一下 [ 開啟]。

  4. 在 [ 可用的資料庫 ] 下拉式清單中,選取持續性資料庫的名稱。

  5. 從 [查詢] 功能表選擇 [執行]。

查詢完成時,資料庫結構描述即已升級,若有需要,可以檢視指派給持續性工作流程執行個體的預設工作流程識別。 在 物件總管 的 [資料庫] 節點中,展開您的持續性資料庫,然後展開 [ Views ] 節點。 以滑鼠右鍵按一下 [ DurableInstancing ],然後選擇 [ 選取前 1000 個數據列]。 滾動至資料行的結尾,並注意有六個額外的資料行加入至 view: IdentityNameIdentityPackageBuild主要次要修訂。 任何保存的工作流程在這些欄位中都會有 null 值,表示 null 工作流程識別。