Windows Workflow Foundation 功能內容

.NET Framework 4 將一些功能新增至 Windows Workflow Foundation。 本文件將描述一些新功能,並且詳細說明適合使用這些功能的案例。

傳訊活動

傳訊活動 (ReceiveSendReplySendReceiveReply) 可用於傳送與接收來自工作流程的 WCF 訊息。 ReceiveSendReply 活動可用於建立 Windows Communication Foundation (WCF) 服務作業,這些作業就跟標準 WCF Web 服務一樣,透過 WSDL 公開。 SendReceiveReply 可用於取用類似 WCF ChannelFactory 的 Web 服務;針對可產生已預先設定活動的 Workflow Foundation,也提供加入服務參考體驗。

傳訊活動使用者入門

  • 在 Visual Studio 2012 中,建立 WCF Workflow Service Application 專案。 一組 ReceiveSendReply 將置於畫布上。

  • 以滑鼠右鍵按一下專案,並選取 [加入服務參考]。 指向現有的 Web 服務 WSDL,然後按一下 [確定]。 組建您的專案,以顯示工具箱中產生的活動 (使用 SendReceiveReply 實作)。

  • 工作流程服務文件

傳訊活動範例案例

BestPriceFinder 服務可呼叫多個航空公司服務,尋找特定航線的最佳機票價格。 若想實作此案例,您必須使用訊息活動來接收價格要求、從後端服務擷取價格,並以最佳價格回覆價格要求。 您也需使用其他立即可用的活動來建立商務邏輯,以計算最佳價格。

WorkflowServiceHost

WorkflowServiceHost 是現成的工作流程主機,支援多個執行個體、組態和 WCF 傳訊 (雖然這些工作流程不需要傳訊即可裝載)。 此外,它也會透過一組服務行為,與持續性、追蹤和執行個體控制項整合。 如同 WCF 的 ServiceHostWorkflowServiceHost 可在主控台/WinForms/WPF 應用程式或 Windows 服務中自我裝載,或在 IIS 或 WAS 中透過 Web 裝載 (存為 .xamlx 檔案) 。

工作流程服務主機使用者入門

WorkflowServiceHost 案例

BestPriceFinder 服務可呼叫多個航空公司服務,尋找特定航線的最佳機票價格。 若想實作此案例,您必須在 WorkflowServiceHost 中裝載工作流程。 它也會使用訊息活動來接收價格要求、從後端服務擷取價格,並以最佳價格回覆價格要求。

相互關聯

相互關聯是指下列其中一種情況:

  • 群組訊息的方式。亦即,要求訊息與其回覆之間的關聯性。

  • 將資料片段對應至服務執行個體的方式。

快速入門

  • 若要開始使用相互關聯,請在 Visual Studio 中建立新的專案。 建立型別為 CorrelationHandle 的變數。

  • 用來將訊息群組在一起之相互關聯的範例就是,將訊息群組在一起的要求-回覆相互關聯。

  • 將資料片段對應至服務執行個體的範例就是內容架構的相互關聯,它會將資料片段 (例如訂單 ID) 對應至特定工作流程執行個體。

    • 在任何傳訊活動上,按一下 CorrelationInitializers 屬性,然後使用您在上述步驟中建立的 QueryCorrelationInitializer 變數來加入 CorrelationHandle。 在下拉式功能表中,按兩下所需的訊息屬性 (例如 OrderID)。 接著,將 CorrelatesWith 屬性設定為上述使用的 CorrelationHandle 變數。
  • 相互關聯概念文件

相互關聯案例

訂單處理工作流程可用於建立新訂單,以及更新進行中的現有訂單。 若想實作此案例,您必須在 WorkflowServiceHost 中裝載工作流程,並使用傳訊活動。 您也必須根據 orderId 相互關聯,以確保更新正確的工作流程。

簡化的組態

WCF 組態結構描述十分複雜,並且為使用者提供了許多難以查找的功能。 在 .NET Framework 4.6.1 中,我們已聚焦過協助 WCF 使用者透過下列功能來設定服務:

  • 移除每項服務明確組態的需求。 如果您並未替服務設定任何<服務>項目,而且您的服務也未以程式設計方式定義任何端點,系統將自動為您的服務新增一組端點,每個服務基底位址和服務實作的每個合約都會有一個端點。

  • 讓使用者定義 WCF 繫結和行為的預設值,以便套用至沒有明確組態的服務。

  • 標準端點會定義可重複使用的預先設定端點,其中一個或多個端點屬性 (位址、繫結和合約) 具有固定的值,而且允許定義自訂屬性。

  • 最後,ConfigurationChannelFactory<TChannel> 可供您集中管理 WCF 用戶端組態,這項功能在應用程式網域載入時間結束後選取或變更組態的案例中非常實用。

快速入門

簡化的組態案例

  • 經驗豐富的 ASMX 開發人員有意開始使用 WCF。 不過,WCF 看起來太過複雜! 我需要在組態檔中寫入哪些資訊? 在 .NET 4 中,您甚至可以決定完全不使用組態檔。

  • 現有的 WCF 服務集非常難以設定和維護。 組態檔具有數千行 XML 程式碼,任意修改可能會非常危險。 因此需要相關協助,以便將程式碼數量減少至較容易管理的數量。

資料合約解析程式

在 .NET Framework 3.5 中,已知型別的設計有一些限制:

  • 您無法在序列化或還原序列化期間,以動態方式加入已知型別。

  • 序列化程式無法處理不明的 xsi:type 資訊。

  • 使用者無法指定想要顯示在 Wire 上的 xsi:type,以便降低 Wire 上序列化執行個體的大小。

DataContractResolver 會在 .NET Framework 4.5 中解決這些問題。

快速入門

資料合約解析程式案例

  • 避免在服務中宣告數十個 KnownTypeAttribute 物件。

  • 減少 XML BLOB 的大小。

流程圖

流程圖是已知的開發架構,可以視覺化方式表示網域問題。 這是我們在 .NET Framework 4 中引進的全新控制流程樣式。 流程圖的核心特性在於,一次只能執行一項活動。 流程圖可以表達迴圈和替代的結果,但本身無法表示同時執行的多個節點。

快速入門

流程圖案例

流程圖活動可用來實作猜測遊戲。 猜測遊戲非常簡單:電腦會選取一個隨機數字,而玩家必須猜測該數字。 每當玩家提交猜測時,電腦就會顯示一個提示 (亦即「試試看較小的數字」)。 如果玩家在 7 次嘗試內猜中數字,將會看到電腦顯示特別的祝賀畫面。 您可以透過組合下列程序性活動來實作此遊戲:

程序性活動 (Sequence、If、ForEach、Switch、Assign、DoWhile 和 While)

程序性活動會使用程式設計人員所熟悉的概念來提供模型循序控制流程的機制。 這些活動會啟用傳統結構的程式語言建構,並適時提供具有通用程序性語言的語言同位,例如 C# 和 Visual Basic。

快速入門

程序性活動案例

  • Parallel:內部網路文件管理系統有文件核准工作流程。 文件必須先由數個部門的人員核准,然後才能發行至內部網路。 並沒有建立核准順序,只要文件處於「待核准」階段,即可隨時進行核准。 使用者提交文件以供檢閱時,必須經過直屬經理、內部網路管理員和內部通訊經理的核准。

  • ParallelForEach<T>:WF 應用程式可管理大型公司內部的企業採購。 企業規則表示,規劃任何採購作業之前,需要三家不同廠商的估價。 採購部門的員工會從公司的廠商清單中選出三家廠商。 選取並通知這些廠商之後,公司將等候其經濟提案。 這些提案可以按照任何順序提出。 為了在 WF 中實作此案例,我們使用了 ParallelForEach<T>,以便逐一查看廠商的集合並且要求其經濟提案。 蒐集所有供應項目之後,系統會選取並顯示最佳提案。

InvokeMethod

InvokeMethod 活動允許叫用範圍內物件或型別的公用方法。 它支援叫用包含或不包含參數 (包括參數陣列) 的執行個體和靜態方法,以及泛型方法。 此外,它也允許以同步和非同步方式執行方法。

快速入門

  • 在 Visual Studio 2012 中建立工作流程主控台應用程式。 在工作流程設計工具中加入 InvokeMethod 活動,並且針對此活動設定靜態和執行個體方法。

  • 設計工具文件:InvokeMethod 活動設計工具

InvokeMethod 案例

  • 需要叫用範圍內物件的方法。 例如,需要將某個值加入至字典。 此時,系統會叫用字典執行個體的 Add 方法,並且提供索引鍵和值。

  • 需要針對舊版 CLR 物件叫用方法。 您可以使用 InvokeMethod,而非建立自訂活動來包裝該舊版類別的呼叫 (如果它在工作流程執行期間位於範圍內的話)。

錯誤處理活動

TryCatch 活動會提供一項機制來攔截一組包含活動執行時所發生的例外狀況 (類似 C# 和 Visual Basic 中的 Try/Catch 建構)。 TryCatch 提供工作流程層級的例外狀況處理。 系統擲回未處理的例外狀況時,就會中止工作流程,也不會執行 Finally 區塊。 這種行為與 C# 一致。

快速入門

錯誤處理案例

需要執行一組活動,而且需要在發生錯誤時執行特定邏輯。 如果在錯誤處理邏輯期間發現錯誤無法復原,就會重新擲回例外狀況,而且父活動 (或主機) 將會處理此問題。

Pick 活動

Pick 活動會提供 WF 中以事件為主的控制流程模型。 Pick 包含許多分支,每個分支會先等待特定事件發生後,再開始執行。 在此設定中,Pick 的行為與 Switch<T> 很相似,因為此活動只會執行它所接聽的其中一個事件集。 每個分支都是由事件驅動,而發生的事件會先執行對應的分支。 所有其他的分支都會取消並停止接聽事件。

快速入門

Pick 案例

系統需要提示使用者輸入。 正常情況下,開發人員會使用 ReadLine 之類的方法呼叫,來提示使用者輸入。 這種設定的問題在於,直到使用者輸入某些內容為止,程式都會處於等候狀態。 在此案例中,您需要使用逾時將封鎖的活動解除封鎖。 常見的案例就是要求在指定的一段時間內完成工作。 讓封鎖的活動逾時則為 Pick 發揮功能的案例。

WCF 路由服務

路由服務旨在成為一般軟體路由器,可供您控制 WCF 訊息在用戶端和服務之間的流動方式。 路由服務可供您分離用戶端與服務,讓您在支援的組態方面享有更多自由,以及在思考如何裝載服務時擁有更大彈性。 在 .NET Framework 3.5 中,用戶端和服務緊密結合;用戶端必須知道與其需要交談的所有服務及其所在位置。 此外,.NET Framework 3.5 中的 WCF 具有下列限制:

  • 錯誤處理很複雜,因為此邏輯必須透過硬式編碼寫入用戶端。

  • 用戶端與服務一定要使用相同的繫結。

  • 很少妥善分解服務:讓用戶端與實作所有功能的單一服務通訊會比在多個服務之間選擇更簡單。

.NET 4 中路由服務的設計目的是要讓上述問題更容易解決。 新的路由服務具有下列功能:

  1. 以內容為基礎的路由 (MessageFilter 物件會檢查訊息來判斷應該傳送的目的地)。

  2. 通訊協定橋接 (傳輸與訊息)

  3. 錯誤處理 (路由器會攔截通訊例外狀況並容錯移轉至備份端點)。

  4. MessageFilterTable<TFilterData> 和路由組態的動態 (記憶體中) 更新。

快速入門

  1. 文件:路由

  2. 範例:路由服務 [WCF 樣本]

  3. 部落格:路由規則!

路由案例

在下列案例中,路由服務很有用:

  • 用戶端可以與多個服務通訊,而不需要直接處理所有服務。

  • 用戶端可以針對用戶端要求執行其他邏輯,以便判斷要路由傳送的目的地。

  • 將用戶端所執行的作業分解成多個服務實作,而不需要重構用戶端。

  • 用戶端與服務可以宣告具有不同安全性設定的不同繫結。

  • 用戶端可以具備更健全的功能,以防範失敗或無法使用服務的情況。

WCF 探索

WCF Discovery 是一項架構技術,可供您在應用程式基礎結構中併入探索機制。 您可以使用這項技術,讓服務成為可探索的服務,並且設定用戶端來搜尋服務。 用戶端不再需要對端點進行硬式編碼,讓應用程式更健全並提高容錯能力。 探索是在應用程式中建置自動組態功能的完美平台。

此產品是以 WS-Discovery 標準為建置基礎。 其目的在成為可互通、可擴充且泛型的產品。 此產品支援兩種作業模式:

  1. 受管理:網路上有一個了解現有服務的實體,因此用戶端會直接查詢此實體以取得資訊。 這種模式類似於 Active Directory。

  2. 臨機操作:用戶端會使用多點傳送訊息來找出服務。

此外,探索訊息無從驗證網路通訊協定。您可以在支援模式需求的任何通訊協定上使用這些訊息。 例如,探索多點傳送訊息可經由 UDP 通道或任何其他支援多點傳送傳訊的網路傳送。 這些設計點結合了功能彈性,可供您因應解決方案而改寫探索。

快速入門

探索案例

開發人員不想要對端點進行硬式編碼,因為它在服務可用時處於未知狀態。 然而,開發人員希望能在執行階段選擇服務。 因此,應用程式的元件之間需要降低耦合、提高健全度,以及自動組態功能。

追蹤

工作流程追蹤可供您深入了解工作流程實例的執行。 追蹤事件會在工作流程內部的活動執行時,從工作流程執行個體層級的工作流程中發出。 您必須將工作流程追蹤參與者加入至工作流程主機,才能訂閱追蹤記錄。 系統會使用追蹤設定檔來篩選追蹤記錄。 .NET Framework 提供了 ETW (Windows 事件追蹤) 追蹤參與者,而且基本設定檔安裝在 machine.config 檔案中。

快速入門

  1. 在 Visual Studio 2010 中,建立 WCF 工作流程服務應用程式專案。 一組 ReceiveSendReply 將置於畫布上,以便開始。

  2. 開啟 web.config 並加入不含設定檔的 ETW 追蹤行為。

    1. 系統會使用預設設定檔。

    2. 開啟事件檢視器,並啟用下列節點中的分析通道:事件檢視器應用程式及服務記錄檔MicrosoftWindows應用程式伺服器-應用程式。 以滑鼠右鍵按一下 [分析],然後選取 [啟用記錄]

    3. 執行工作流程服務。

    4. 在事件檢視器中查看工作流程追蹤事件。

  3. 範例:追蹤

  4. 概念文件:工作流程追蹤和溯源

SQL 工作流程執行個體存放區

SqlWorkflowInstanceStore 是以 SQL Server 為基礎的執行個體存放區實作。 執行個體存放區會儲存執行中執行個體的狀態以及載入和繼續該執行個體所需的所有資料。 如果工作流程會保存,服務主機就會指示執行個體存放區儲存執行個體狀態,而且當該執行個體的訊息送達或延遲活動過期時,它就會指示執行個體存放區載入執行個體狀態。

快速入門

  1. 在 Visual Studio 2012 中,建立包含隱含或明確 Persist 活動的工作流程。 將 SqlWorkflowInstanceStore 行為加入至工作流程服務主機。 您可以在程式碼或應用程式組態檔中進行這項作業。

  2. 範例:持續性

  3. 概念文件:SQL 工作流程執行個體存放區