共用方式為


使用 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 工作流程定義啟動工作流程,該工作流程定義與 identityV1WorkflowIdentity 相關聯。

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 資料庫指令碼,以升級使用 .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. 從 [查詢] 功能表選擇 [執行]

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