.NET Framework 4 將 Windows Workflow Foundation (WF4) 與 Windows Communication Foundation (WCF) 深度整合,開發者可透過**完全宣告式**設計 (零程式碼) 建構企業級長期執行服務。本文以房地產公司 Contoso 的抵押審批流程為例,展示 Flowchart 建模、自訂活動組合、關聯、持久化、ETW 追蹤、服務參考產生 Proxy 活動等核心功能。

.xamlx 服務定義檔。Receive/SendReply 推導產生。web.config 極度精簡,得益於 WCF 4 簡化設定。順序工作流難以表達「退回補件後重新提交」的回溯邏輯。Flowchart (WF4 新增) 以節點與箭頭直觀描述:
Receive (CanCreateInstance=true) 接收申請。Approved/Rejected/Incorrect。FlowSwitch 依篩選結果分流:Rejected 直接回覆、Incorrect 關聯回溯 Receive、Approved 進入供應商詢價。

客戶補件時需路由至原實例。使用內容式關聯:
CorrelationHandle 變數 (customerCorrelationHandle)。Receive 設定 CorrelationInitializers 從 customerCode 參數初始化。Receive (補件、狀態查詢) 設定 CorrelatesWith=handle、CorrelatesOn=customerCode XPath 查詢。三家供應商邏輯相同,僅端點 URI 不同。建立宣告式自訂活動 (Activity 專案範本):
Parallel:左分支 Send 詢價 → ReceiveReply 等待回應 → 設定完成旗標;右分支 While 迴圈監聽客戶狀態查詢 (Receive/SendReply),完成旗標為真則退出。customerCode 關聯。
專案右鍵 Add Service Reference 指向 CRM 服務 → 自動產生每個操作對應的活動 (如 LogInteraction),拖放即用,免去手寫 Channel Factory 代碼。

web.config 宣告式設定:
<sqlWorkflowInstanceStore connectionString="Data Source=.\SQLExpress;Initial Catalog=InstanceStore;Integrated Security=True" />
<workflowIdle timeToUnload="0" /> <!-- 閒置立即卸載持久化 -->
WorkflowServiceHost 自動載入正確實例。web.config 啟用 EtwTrackingParticipant 並指定 HealthMonitoring 追蹤設定檔:
<etwTracking profileName="HealthMonitoring" />
<tracking>
<trackingProfile name="HealthMonitoring">
<workflow activityDefinitionId="*">
<workflowInstanceQueries>
<workflowInstanceQuery>
<states><state name="Started"/><state name="Completed"/><state name="Aborted"/><state name="UnhandledException"/></states>
</workflowInstanceQuery>
</workflowInstanceQueries>
<faultPropagationQueries>
<faultPropagationQuery faultSourceActivityName="*" faultHandlerActivityName="*"/>
</faultPropagationQueries>
</workflow>
</trackingProfile>
</tracking>
事件寫入 Windows 事件日誌,可透過事件檢視器或 AppFabric 儀表板監控實例狀態、錯誤傳播、效能指標。
EvaluateMortgage (對應首個 Receive) 啟動實例,後續狀態查詢對應其他 Receive。
WF4 + WCF 4 實現了宣告式服務構建:Flowchart 建模業務流、自訂活動封裝可重用邏輯、關聯解決實例路由、持久化支援長期執行、ETW 追蹤提供生產可觀測性。全程零業務代碼,僅組態與設計器操作,極大降低分散式長期流程開發門檻。完整範例:MSDN Code Gallery。