交談範例

這個範例會示範工作流程服務如何透過相同合約與多個用戶端平行交談。此範例也會示範如何使針對相同合約和相同作業而傳送,但因為是由不同用戶端所傳送,而必須以不同方式來處理的訊息相互關聯。為了達到平行交談,這個範例會使用工作流程服務所提供的交談內容功能。

Bb410775.note(zh-tw,VS.90).gif注意:
要建置和執行這個範例,必須安裝 .NET Framework version 3.5。要開啟專案和方案檔,必須要有 Visual Studio 2008。

如需 設定這個範例的詳細資訊,請參閱 Windows Communication Foundation 範例的單次安裝程序

這個範例也會使用非同步雙工通訊,使工作流程服務和用戶端能夠以非同步方式通訊。在雙工通訊中,這兩個應用程式必須在開始通訊之前,先交換內容。啟始交談的服務會接收回覆其訊息的內容。工作流程服務提供了這項功能。若要支援接收服務到初始化服務之間的通訊,初始化服務必須在第一則訊息中傳送其內容資訊。下圖顯示此範例的架構。

交談範例架構

交談範例

這個範例會實作下列案例。

客戶傳送訂單要求。為了回應這個要求,供應商希望取得三個不同物流提供者的報價,以便出貨。供應商會將訊息傳送給這三個物流提供者。每個提供者會在相同的合約上叫用相同的作業,進而傳回報價。由於供應商工作流程使用交談內容,其中的功能就會使報價與正確的接收活動相互關聯,以進一步處理這些報價。供應商收到所有報價之後,選出最低的報價,然後傳送給客戶。

在這個範例中,有五個實體會進行通訊:

  • 客戶服務
    客戶服務會將訂單明細傳送給供應商,其中包含供應商服務之後用來與客戶服務進行通訊的內容。這個基本工作流程包含初始傳送活動,這個活動會將含有訂單和內容的訂單要求訊息當做承載傳送出去。接收活動則會等待供應商服務的回應。
    客戶服務傳送的內容會與接收活動產生相關聯。傳送活動的「傳送前」處理常式包含程式碼,可從接收活動中取得內容。接收活動包括下列 GetContext 方法,呼叫此方法即可取得內容。

    private void PrepareOrder(object sender, SendActivityEventArgs e)
    {
        this.order.Amount = 1000;
        this.order.OrderId = 1234;
        this.contextToSend = this.ReceiveOrderDetails.Context;
    }
    
  • 供應商服務
    供應商服務會與三個物流提供者通訊。為了進行通訊,供應商服務會針對每個交談和非同步雙工通訊使用唯一內容語彙基元的組合。它會將客戶和供應商服務之間通訊訊息本文中的內容傳送出去。
    在與物流提供者通訊之前,供應商服務會先從客戶服務接收訊息。在這個訊息中,供應商服務也會接收用來與客戶服務進行通訊的內容。供應商服務工作流程會將此內容套用至 Send 活動,此活動會將訊息傳送至用戶端服務。實作此功能的程式碼位在第一個接收活動內程式碼活動的程式碼處理常式中,如下列程式碼所示。

    private void AcceptOrder(object sender, EventArgs e)
    {
        Console.WriteLine("Order Received...");
        this.supplierAck = "Order Received on " + DateTime.Now;
        this.SendOrderDetails.Context = this.customerContext;
    }
    

    一旦供應商服務接收到客戶的訊息,供應商就會啟始與這三個物流提供者的三個平行交談。每個交談分支都有 SendReceive 活動,如上圖所示。每個分支中的 Send 活動都會將訊息傳送給一個物流提供者。該分支中對應的 Receive 活動則必須接收來自供應商的訊息。為了達到此目的,訊息承載中的 Send 活動必須傳送承載中唯一的內容。接著,物流提供者傳回報價訊息時,會在訊息標頭中使用此內容。
    根據預設,每個 Receive 活動都有根內容。為了使 Receive 活動成為唯一的,Receive 活動會定義一個內容,其範圍限定為根活動以外的父活動。在下列範例中,平行交談中每個 Receive 活動的內容語彙基元屬性都有唯一的名稱,並且會將範圍限定為所在的平行活動中。當每個平行分支內的傳送活動從接收活動取得內容時,就會取得對該 Receive 活動而言獨一無二的內容。這個唯一內容也可以用來為接聽接收活動的佇列建立佇列名稱。當物流提供者傳回標頭中含有內容的報價時,工作流程服務分派層會使用此報價來建立適當的佇列名稱,並將 Receive 活動接著要查看的訊息排入佇列。
    private void PrepareShipper2Request(object sender, SendActivityEventArgs e)
    {
    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine("RequestShippingQuote from Shipper2");
    Console.ResetColor();
    this.contextShipper2 = this.ReceiveQuoteFromShipper2.Context;
    }
    物流提供者工作流程會接收供應商的報價要求和內容。該內容會套用至將訊息傳回供應商的傳送活動,如下列程式碼所示。

    private void AcceptQuoteRequest(object sender, EventArgs e)
    {
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("Received ShippingQuote Request");
        this.supplierAck = "Working on quote...";
        Console.ResetColor();
        this.SendShippingQuote.Context(this.supplierContext);
    }
    

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

  1. 根據預設,這個範例不會使用持續性。如果想要使用持續性,您必須針對每個方案,在 App.config 檔中新增 <WorkflowRuntime> 項目。此項目應該位於 behaviors 區段下,如下列範例所示。

    <behaviors>
          <serviceBehaviors>
            <behavior name="ServiceBehavior"  >
              <serviceMetadata httpGetEnabled="false" />
              <serviceDebug includeExceptionDetailInFaults="true" />
              <workflowRuntime name="WorkflowServiceHostRuntime" validateOnCreate="true" enablePerformanceCounters="true">
                <services>
                  <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                       connectionString="Data Source=localhost\sqlexpress;Initial Catalog=ServiceModelSamples_ServiceWorkflowStore;Integrated Security=True;Pooling=False"
                       LoadIntervalSeconds="1" UnLoadOnIdle= "true" />
                </services>
              </workflowRuntime>
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
  2. 除了 behaviors 區段下的 <WorkflowRuntime> 項目以外,還新增了 SQL 持續性服務。執行位於 Windows Communication Foundation 範例的單次安裝程序主題中的 CreateStores.cmd 指令碼。CreateStores.cmd 指令碼會建立 ServiceModelSamples_ServiceWorkflowStore 資料庫。根據預設,會在 SQL Server 2005 Express Edition 資料庫中建立上述資料庫。請確定您已在電腦上安裝 SQL Server Express。如果您不想安裝 SQL Server Express 而要使用 SQL Server,請務必針對持續性資料庫修改 App.config 檔中的連線字串。

  3. 一旦所有工作流程服務都在執行時,請在用戶端工作流程中按下 ENTER 鍵,以檢視彼此通訊的所有工作流程。訂單會傳送給供應商,而供應商接著會將物流報價要求傳送給所有物流供應商。供應商收到報價之後,您就會看到最低的報價已傳回給客戶。此外,您也可以驗證每個案例中的內容語彙基元。這樣可以幫助您瞭解傳給每個物流提供者的唯一內容。

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