BizTalk 訊息引擎會產生肯定回應(ACK)和否定回應(NACK),以回應透過埠處理訊息期間遇到的狀況。 BizTalk Server 會發佈正面通知,表示訊息成功傳輸,以及指出訊息的傳輸失敗和暫停的負面通知。
為什麼要使用致謝?
正面和負面通知提供強烈意見反應,可讓您用來判斷訊息是否已抵達其目的地,或一路上遇到一或多個問題。 例如,通知在下列情況下很有用:
您想要監視新貿易夥伴的接收埠,以進行架構驗證和其他錯誤。
如果貸款要求成功傳送給合作夥伴進行核准,則您想要將送出以供核准的貸款要求狀態標示為「正在處理中」,如果傳輸失敗,則為「失敗」(例如,如果合作夥伴的伺服器已關閉)。
您處理包含多個採購單的交換訊息,並希望追蹤成功傳輸或傳輸失敗的訂單數目。
您可以使用使用篩選條件的通知和內容型路由來完成上述每個案例。
路由確認
在發送 ACK 或 NACK 時,來自導致 ACK/NACK 的原始訊息的所有訊息上下文屬性都會被降級。 任何升級的屬性都不會流向確認。 若要路由確認回應,請使用 BTS 命名空間中的下列屬性來建置篩選器:
| 屬性名稱 | 數據類型 | 說明 |
|---|---|---|
| BTS。AckFailureCategory | xs:int | 識別 ErrorCategory,這會提供暫停的位置和原因。 |
| BTS.AckFailureCode | xs:string | 識別 ErrorCode,這會提供暫停的位置和原因。 |
| BTS.AckType | xs:string | 值為代表正向確認的 ACK,而代表負向確認的 NACK。 |
| BTS。AckID | xs:string | 識別原始訊息的 MessageID 。 |
| BTS.AckOwnerID | xs:string | 從原始訊息識別實例標識碼。 |
| BTS.CorrelationToken | xs:string | 如果原始訊息中存在關聯令牌,則識別該令牌。 |
| BTS.AckDescription | xs:string | 識別 ErrorDescription,這會提供暫停的位置和原因。 |
| BTS.AckSendPortID | xs:string | 從原始訊息識別 SendPortID 。 |
| BTS.AckSendPortName | xs:string | 從原始訊息識別 SendPortName 。 |
| BTS.AckOutboundTransportLocation | xs:string | 從原始訊息識別 OutboundTransportLocation 。 |
| BTS.AckReceivePortID | xs:string | 識別原始訊息中的 ReceivePortID。 |
| BTS.AckReceivePortName | xs:string | 識別原始訊息中的 ReceivePortName。 |
| BTS.AckInboundTransportLocation | xs:string | 從原始訊息識別 InboundTransportLocation 。 |
備註
包含錯誤資訊的屬性不存在於 ACK 中,因為它們表示正傳遞。
否認確認訊息本文
有關正面或負面認可的大部分重要資訊都包含在內容屬性中。 除了上下文屬性外,NACK 還包含一個訊息主體部分,其中包含SOAP錯誤。 SOAP 錯誤的格式如下所示:
<?xml version="1.0" encoding="utf-8"?>
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" SOAP:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP:Body>
<SOAP:Fault>
<faultcode>Microsoft BizTalk Server Negative Acknowledgment </faultcode>
<faultstring>An error occurred while processing the message, refer to the details section for more information </faultstring>
<faultactor>C:\Projects\Sample\Locations\Response\FM_%MessageID%.xml</faultactor>
<detail>
<ns0:NACK Type="NACK" xmlns:ns0="http://schema.microsoft.com/BizTalk/2003/NACKMessage.xsd">
<NAckID>{FFB1A60B-E593-4620-8897-4E9C7030A937}</NAckID>
<ErrorCode>0xc0c01658</ErrorCode>
<ErrorCategory>0</ErrorCategory>
<ErrorDescription>There was a failure executing the send pipeline: "Microsoft.BizTalk.DefaultPipelines.XMLTransmit, Microsoft.BizTalk.DefaultPipelines, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Source: "XML assembler" Send Port: "Failed Message" URI: "C:\Projects\Sample\Locations\Response\FM_%MessageID%.xml" Reason: This Assembler cannot retrieve a document specification using this type: "http://Sample#Unknown". </ErrorDescription>
</ns0:NACK>
</detail>
</SOAP:Fault>
</SOAP:Body>
</SOAP:Envelope>
配接器引發的例外狀況訊息位於 ErrorDescription 元素的 SOAP 詳細數據區段中。
從協調流程存取訊息本文
如果您有需要傳遞通知的協作埠,當傳輸失敗時,會擲回的 DeliveryFailureException 會從 NACK 訊息本文中包含的 SOAP 錯誤被反序列化。 若要從協調流程中存取例外狀況訊息字串,請將 DeliveryFailureException 轉換為 SoapException,然後存取 InnerXml,如下列程式代碼所示:
// Cast the DeliveryFailureException to a SoapException…
System.Web.Services.Protocols.SoapException se = (System.Web.Services.Protocols.SoapException)e.InnerException;
System.Diagnostics.Trace.WriteLine(se.Detail.InnerXml);
//e is an Microsoft.XLANGs.BaseTypes.DeliveryFailureException
//object type created in an Exception handler
上述程式代碼範例會傳回類似下列的 XML 片段:
<?xml version="1.0" encoding="utf-8"?>
<ns0:NACK Type="NACK" xmlns:ns0="http://schema.microsoft.com/BizTalk/2003/NACKMessage.xsd">
<NAckID>{FFB1A60B-E593-4620-8897-4E9C7030A937}</NAckID>
<ErrorCode>0xc0c01658</ErrorCode>
<ErrorCategory>0</ErrorCategory>
<ErrorDescription>There was a failure executing the send pipeline: "Microsoft.BizTalk.DefaultPipelines.XMLTransmit, Microsoft.BizTalk.DefaultPipelines, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Source: "XML assembler" Send Port: "Failed Message" URI: "C:\Projects\Sample\Locations\Response\FM_%MessageID%.xml" Reason: This Assembler cannot retrieve a document specification using this type: "http://Sample#Unknown".</ErrorDescription>
</ns0:NACK>
何時發佈確認書?
正面 (ACK) 和負數 (NACK) 通知都會發佈至 MessageBox 資料庫,前提是至少有一個相符的訂用帳戶。 例如,如果 BizTalk Server 找不到從接收埠讀取之訊息的相符架構,而且沒有 NACK 訂閱,則會暫停訊息(如果尚未啟用失敗的訊息路由),而且不會發布 NACK