共用方式為


如何使用運算式執行管線

BizTalk Server能夠從協調流程內同步呼叫管線。 這可以讓協調流程針對資料體而利用封裝在管線內容的訊息處理功能 (傳送或接收),而不需透過傳訊基礎結構來傳送該資料。

協調流程可藉由此功能呼叫傳送管線,以將數個訊息彙總為單一的外寄交換。 相反地,協調流程也可以呼叫接收管線,針對在傳訊基礎結構外部所取得的交換進行解碼及解譯,而不需透過 MessageBox 進行處理。

詳細資料

協調流程會使用 XLANGPipelineManager 類別中的方法, (Microsoft.XLANGs.Pipeline 命名空間) 呼叫傳送或接收管線。 接收管線會使用單一訊息或交換,並在管線於 BizTalk 傳訊內的接收訊息內容中執行時,產生零個或多個訊息。 傳送管線會使用一個或多個訊息,並同樣在管線於 BizTalk 傳訊內的傳送訊息內容中執行時,產生單一的訊息或交換。

呼叫接收管線

為了從協調流程內呼叫接收管線,應用程式會呼叫XLANGPipelineManager類別的ExecuteReceivePipeline () 方法。 這個方法會取用單一交換,並傳回 包含在 ReceivePipelineOutputMessages 類別實例中的零或多個 (訊息集合) 。 這個方法的語法詳述于 XLANGPipelineManager 類別的 .NET 類別庫參考中。

從協調流程內執行接收管線的 API 為:

// Execute receive pipeline

static public ReceivePipelineOutputMessages ExecuteReceivePipeline(System.Type receivePipelineType, XLANGMessage msg);

對接收管線的呼叫通常會在協調流程內的 運算式 圖形中完成。

為了從協調流程內部呼叫接收管線,開發人員必須在協調流程專案中參考管線組件。 以下是呼叫接收管線的協調流程範例:

呼叫接收管線畫面

如需更詳細的範例,請參閱 SDK 範例撰寫訊息處理器 (BizTalk Server 範例)

注意

ReceivePipelineOutputMessages類型的變數只能在協調流程中不可部分完成的範圍內宣告。 這是因為此類型的變數並未序列化,因此無法在持續的協調流程使用,而在不可部分完成的範圍內執行的協調流程也絕對無法持續。 這代表接收管線只能在不可部分完成的範圍內執行。

注意

從協調流程內呼叫 PassThruReceive 管線或自訂管線元件時,您必須將傳入訊息的變數類型宣告為 System.Xml。雖然傳入訊息類型為 XML,但 XmlDocument 為 XML。 因此,如果內送訊息為一般檔案格式訊息的非 XML 訊息,而您嘗試要在其上作業,則可能會遇到例外狀況。 這是因為在上述的案例中,該協調流程引擎會對任何類型的內送訊息使用 System.Xml.XmlDocument。

呼叫傳送管線

若要從協調流程內呼叫傳送管線,應用程式會呼叫XLANGPipelineManager類別的ExecuteSendPipeline () 方法。 這個方法會取用 包含在 SendPipelineInputMessages 類別實例中的一或多個訊息集合 (,) 並傳回單一交換。 這個方法的語法詳述于 XLANGPipelineManager 類別的 .NET 類別庫參考中。 由於執行傳送管線會產生新的交換,因此必須在訊息指派圖形內呼叫 ExecuteSendPipeline () 方法,例如:

從協調流程內部執行傳送管線的 API 為:

// Execute a send pipeline

static public ExecuteSendPipeline(System.Type sendPipelineType, SendPipelineInputMessages inputMsgs, XLANGMessage msg);

對傳送管線的呼叫必須在協調流程內的 訊息指派 圖形中完成。

為了從協調流程內部呼叫傳送管線,開發人員必須在協調流程專案中參考管線組件。 呼叫傳送管線的協調流程範例:

呼叫傳送管線畫面

注意

在呼叫預設的 XMLTransmit 管線時,必須將訊息內容屬性 XMLNORM.EnvelopeSpecName 設定為「信封」結構描述的完整格式名稱。 例如:

MyMessage(XMLNORM.EnvelopeSpecName) = "PipelineSchemas.POEnv, PipelineSchemas, Version=1.0.0.0, Culture=nuetral, PublicKeyToken=12e5cc95621c33e8";

如需更詳細的範例,請參閱 SDK 範例匯總工具 (BizTalk Server 範例)

管線執行 - 行為差異

由協調流程呼叫傳送或接收管線時,該管線的執行,大致與它在傳訊基礎結構內 (在接收位置或傳送埠上) 執行時相同。 不過仍有些特定的行為差異,如下所述。

管線階段內的差異

從協調流程內呼叫傳送或接收管線時,其階段的執行,幾乎與該管線是從 BizTalk 傳訊基礎結構呼叫時的階段執行相同,例外狀況如下所示。

  • 組合器/反組譯程式:組合器和反組譯程式階段將不會處理 追蹤設定檔 資料。

  • 編碼器/解碼器:MIME 編碼器會使用在主機相關聯的主機上設定的憑證,以數位方式簽署訊息。 SMIME 編碼器會在傳遞給管線的訊息內容上,使用該憑證來加密訊息。

結構描述解析

從協調流程執行管線時,會支援兩種結構描述尋查演算法。

  • 依型別解析

  • 依名稱解析

    如果部署了重複的結構描述,則用於選取適當結構描述的演算法邏輯,與在傳訊基礎結構內容中執行時所使用的邏輯相同。

交易管線

如果管線的階段會呼叫交易式元件,則該管線沒有可用的交易式內容。 對 IPipelineCoNtext.GetTransaction () 的任何呼叫都會擲回 NotSupportedException。 這樣並不會造成無法從協調流程執行此類管線,但的確代表該管線不必偵測和處理這種情況。

訊息目的地

在此內容中並不支援依管線元件控制訊息目的地。 設定內容屬性 MessageDestinationSuspendOnRoutingFailure 會導致擲回 XLANGPipelineManagerException

管線元件類型

若要從協調流程內呼叫管線元件,則該元件必須以下列項目為基礎:

  • .NET Framework v1.1

  • .NET Framework v2.0

  • .NET Framework v3.0

  • .NET Framework v3.5

  • .NET Framework v4.0

  • .NET Framework v2.0

  • COM

限制

無法從協調流程內執行下列類型的管線:

  • 交易管線

  • 可復原管線

  • 呼叫 BAM 攔截器 API 的管線 (NotSupportedException 將會擲回) 。

  • 相同的管線執行個體無法在不同分支的平行圖形中執行,除非是放在每個分支的同步化範圍中。

  • 現有管線 (針對 BizTalk Server 2006 SDK 建置的元件) 。

失敗模式和效果

如果因為從 BizTalk Server 傳訊基礎結構內呼叫管線而導致訊息擱置,則該執行管線時的任何失敗都會導致擲回例外狀況。 擲回的例外狀況的類型為 Microsoft.XLANGs.Pipeline.XLANGPipelineManagerException。 可在呼叫協調流程中的 Catch 區塊中處理這個擲回的例外狀況。 如果協調流程並未捕捉到擲回的例外狀況,則 XLANGs 引擎會報告錯誤,並在文字中包含擲回例外狀況中的例外狀況資訊。

例外狀況會對管線元件所產生的錯誤訊息執行格式設定。

XLANGPipelineManagerException類別的Message屬性包含管線執行錯誤的詳細資料。 此詳細資料會使用下列格式:

  • 執行管線管線 < 類型 > 時發生失敗。 錯誤詳細資料 < 格式化的錯誤訊息 > 。

    在此訊息中, < 管線類型 > 是管線類別的名稱,而 < 格式化的錯誤訊息 > 是管線執行期間所發生之特定失敗的描述。

    例如,如果協調流程呼叫接收管線,而且該管線的執行失敗,因為管線的元件都無法辨識訊息, 則 XLANGPipelineManagerException的屬性值為:

XLANGPipelineManagerException 屬性
訊息 執行接收管線 "MyPipelines.ReceivePipeline" 失敗。 錯誤詳細資料:「沒有可反組譯階段元件可以辨識資料。
元件 String.Empty

另一個範例是,如果協調流程呼叫傳送管線,而且該管線的執行因為驗證失敗而失敗,則 XLANGPipelineManagerExceptionMessage屬性中的文字會是:

XLANGPipelineManagerException 屬性
訊息 執行傳送管線 "MyPipelines.SendPipeline" 失敗。 錯誤詳細資料:「無法驗證檔:「元素 < 名稱 > 元素無效 - 值 < 元素值 > 根據其資料類型 'String' 無效 - 模式條件約束失敗」。
元件 “Microsoft.BizTalk.Component.XmlValidator”