雙工工作流程服務範例
這個範例會示範如何在兩個通訊服務之間執行非同步雙工通訊。此範例另外還示範了如何使用訊息來執行 localhost 對工作流程通訊。在兩個服務之間執行雙工通訊時,這兩個服務必須在進行雙向通訊之前,先行交換內容。初始通訊的服務會接收內容,以回覆其訊息。若要支援接收服務到初始化服務之間的通訊,初始化服務必須在第一則訊息中傳送其內容資訊。
![]() |
---|
要建置和執行這個範例,必須安裝 .NET Framework version 3.5。要開啟專案和方案檔,必須要有 Visual Studio 2008。 |
如需 設定這個範例的詳細資訊,請參閱 Windows Communication Foundation 範例的單次安裝程序。
localhost 和服務之間的通訊也會使用訊息。Localhost 會公開已知的端點,讓服務可以進行回呼。這個範例會實作 LocalWorkflowServiceHost
型別,其中提供的功能可建立本機接聽項,以及用於裝載服務的工作流程服務主機。
這個範例包括下列通訊實體:
用戶端主機
用戶端主機會呼叫IReverseContract
上的作業,而與用戶端工作流程進行通訊。當用戶端主機第一次呼叫BeginWork
作業時,就會建立用戶端工作流程。為了回應BeginWork
作業,用戶端工作流程會傳送回其中包含用戶端工作流程內容的訊息。主機建立來與用戶端工作流程通訊的通道,現在就擁有內容可進一步通訊。這個範例會顯示用戶端主機如何使用相同的通道,將多個工作項目傳送至用戶端工作流程。
若要讓工作流程與用戶端主機通訊,用戶端主機會提供可接聽的已知端點。在此範例中,該已知端點的名稱為HostEndPoint
。您可以使用LocalWorkflowServiceHost
對用戶端主機建立該已知端點,也可對用戶端工作流程建立工作流程服務主機。LocalWorkflowServiceHost localHost = new LocalWorkflowServiceHost(typeof(ClientWorkflow),new ClientHost()); localHost.WorkflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e) { Console.WriteLine("WorkflowTerminated: " + e.Exception.Message); }; localHost.WorkflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { Console.WriteLine("WorkflowCompleted: " + e.WorkflowInstance.InstanceId.ToString()); }; localHost.Open();
用戶端工作流程 (公開為服務)
用戶端工作流程會實作IReverseContract
。服務工作流程會透過此項,與用戶端工作流程進行通訊,如前圖所示。用戶端工作流程會先呼叫BeginWorkflow
作業,因而建立服務工作流程。回覆則傳回服務工作流程的內容,這些內容會用於與服務工作流程後續的用戶端工作流程通訊中。做為BeginWorkflow
作業的一部分,用戶端工作流程會傳遞本身的端點參考,而這參考中則包含端點位址以及服務工作流程的內容標頭。服務工作流程會使用此端點位址,與用戶端工作流程進行非同步通訊。
初始狀態中的WaitForBeginWork
事件處理常式會實作名稱為DoSetReturnAddress
的程式碼活動。這個活動會設定傳送至服務工作流程的端點參考,如下列範例所示。private void SetReturnAddress(object sender, EventArgs e) { EndpointAddress epr = ContextManager.CreateEndpointAddress(ReturnUri, this.ReceiveWorkItemComplete); ReturnAddress = EndpointAddress10.FromEndpointAddress(epr); DebugOutput("[ClientWorkflow:SetReturnAddress] " + epr.Headers[0].GetValue<string>()); }
服務主機
這個範例會實作工作流程服務主機。並開啟會從用戶端接聽要求的接聽項。用戶端的第一個要求會建立服務工作流程的執行個體。所有後續要求都會路由至相同的工作流程執行個體,這是因為要求中都含有訊息標頭的內容。服務工作流程 (公開為服務)
服務工作流程會實作IForwardContract
。BeginWorkflow
作業中的服務工作流程會接收用戶端工作流程的端點參考。服務工作流程會將該端點參考套用至 Send 活動,而這個活動會將訊息以非同步方式傳送至用戶端工作流程。WaitForBeginWorkflow
事件處理常式則提供BeginWorkflow
接收活動。在接收活動內會有名稱為ApplyReturnAddress
的程式碼活動,這個程式碼活動會使用傳送活動中的傳回位址,將訊息傳送至用戶端工作流程,如下列程式碼所示。private void ApplyReturnAddress(object sender, EventArgs e) { // apply ReturnAddress to ReverseEndpoint EndpointAddress epr = ReturnAddress.ToEndpointAddress(); ContextManager.ApplyEndpointAddress( this.SendWorkItemComplete, epr); DebugOutput("[ServiceWorkflow:ApplyReturnAddress] " + epr.Headers[0].GetValue<string>()); }
LocalWorkflowServiceHost
類別會針對主機對工作流程的通訊,建立必要的基礎結構。本機工作流程服務會執行兩個主要工作:- 對主機建立本機接聽項,以接聽來自工作流程的訊息。
- 執行個體化 WorkflowServiceHost,以建立工作流程的接聽項。
類別也會對主機提供 Helper 函式,以維護用於與工作流程通訊的內容。如果回收主機,便會用此內容與工作流程執行個體通訊。
WorkflowServiceUtility 專案提供處理內容時所需的所有 Helper 函式。它所提供的功能包括從通道中擷取內容、將內容套用至通道,以及將端點位址套用至傳送活動。
若要設定、建置及執行範例
若要安裝持續性提供者,請執行 Windows Communication Foundation 範例的單次安裝程序主題中的 CreateStores.cmd 指令碼。
下載工作流程服務公用程式後儲存,讓 DuplexWorkflowService 和 WorkflowServiceUtility 資料夾都位在相同的上層資料夾。
如果不想使用持續性提供者,請取消註解 App.config 檔案的
<WorkflowRuntime>
區段。這個範例會使用兩個持續性資料庫。服務工作流程會使用
NetFx35Samples_ServiceWorkflowStore
,而用戶端則會使用NetFx35Samples_ClientWorkflowStore
。您可以在 SQL Server 或 SQL Server Express 中建立這些存放區。App.config 檔案中目前的連線字串假設您使用 SQL Server Express。如果在 SQL Server 中建立存放區,請務必變更 App.config 檔案中的連線字串。一旦用戶端主機和服務主機都在執行時,請按主控台視窗中的 [Y],便可處理工作項目。您可以傳送多個工作項目來進行處理。如果關閉後重新啟動用戶端,會從停止的位置繼續執行。
若要測試服務的長期性,請關閉用戶端和服務應用程式,然後先重新啟動用戶端應用程式,再重新啟動服務應用程式。這個順序很重要,因為只要服務工作流程正在執行,就會嘗試將訊息傳回用戶端。而如果無法使用用戶端,就會收到例外狀況。
在用戶端上,會將內容存放在 Client.ctx 檔中。該檔案則存放在範例的 \bin 目錄中。當您重新開啟用戶端時,它會檢查檔案是否存在。如果該檔案存在,它就會將儲存的內容套用至要建立的通道。如果工作流程服務已完成,而您開啟用戶端時 Client.ctx 檔案仍在 \bin 目錄中,它會嘗試將內容套用至通道。如果您要與其通訊的工作流程執行個體不存在,就會產生錯誤。請刪除檔案然後再試一次。
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.