雙工工作流程服務範例

這個範例會示範如何在兩個通訊服務之間執行非同步雙工通訊。此範例另外還示範了如何使用訊息來執行 localhost 對工作流程通訊。在兩個服務之間執行雙工通訊時,這兩個服務必須在進行雙向通訊之前,先行交換內容。初始通訊的服務會接收內容,以回覆其訊息。若要支援接收服務到初始化服務之間的通訊,初始化服務必須在第一則訊息中傳送其內容資訊。

Bb410772.note(zh-tw,VS.90).gif注意:
要建置和執行這個範例,必須安裝 .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>());
    }
    
  • 服務主機
    這個範例會實作工作流程服務主機。並開啟會從用戶端接聽要求的接聽項。用戶端的第一個要求會建立服務工作流程的執行個體。所有後續要求都會路由至相同的工作流程執行個體,這是因為要求中都含有訊息標頭的內容。

  • 服務工作流程 (公開為服務)
    服務工作流程會實作 IForwardContractBeginWorkflow 作業中的服務工作流程會接收用戶端工作流程的端點參考。服務工作流程會將該端點參考套用至 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 函式。它所提供的功能包括從通道中擷取內容、將內容套用至通道,以及將端點位址套用至傳送活動。

若要設定、建置及執行範例

  1. 若要安裝持續性提供者,請執行 Windows Communication Foundation 範例的單次安裝程序主題中的 CreateStores.cmd 指令碼。

  2. 下載工作流程服務公用程式後儲存,讓 DuplexWorkflowService 和 WorkflowServiceUtility 資料夾都位在相同的上層資料夾。

  3. 如果不想使用持續性提供者,請取消註解 App.config 檔案的 <WorkflowRuntime> 區段。

  4. 這個範例會使用兩個持續性資料庫。服務工作流程會使用 NetFx35Samples_ServiceWorkflowStore,而用戶端則會使用 NetFx35Samples_ClientWorkflowStore。您可以在 SQL Server 或 SQL Server Express 中建立這些存放區。App.config 檔案中目前的連線字串假設您使用 SQL Server Express。如果在 SQL Server 中建立存放區,請務必變更 App.config 檔案中的連線字串。

  5. 一旦用戶端主機和服務主機都在執行時,請按主控台視窗中的 [Y],便可處理工作項目。您可以傳送多個工作項目來進行處理。如果關閉後重新啟動用戶端,會從停止的位置繼續執行。

  6. 若要測試服務的長期性,請關閉用戶端和服務應用程式,然後先重新啟動用戶端應用程式,再重新啟動服務應用程式。這個順序很重要,因為只要服務工作流程正在執行,就會嘗試將訊息傳回用戶端。而如果無法使用用戶端,就會收到例外狀況。

  7. 在用戶端上,會將內容存放在 Client.ctx 檔中。該檔案則存放在範例的 \bin 目錄中。當您重新開啟用戶端時,它會檢查檔案是否存在。如果該檔案存在,它就會將儲存的內容套用至要建立的通道。如果工作流程服務已完成,而您開啟用戶端時 Client.ctx 檔案仍在 \bin 目錄中,它會嘗試將內容套用至通道。如果您要與其通訊的工作流程執行個體不存在,就會產生錯誤。請刪除檔案然後再試一次。

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.