受信確認の使用
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 | 元のメッセージのインスタンス ID を確認します。 |
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 を識別します。 |
Note
エラー情報を含むプロパティは、配信確認で示されるので、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>
受信確認が生成される場合とは
少なくとも 1 つのサブスクリプションが一致する場合、肯定受信確認応答 (ACK) および否定受信確認応答 (NACK) の両方が障害発生時点のメッセージ ボックス データベースに生成されます。 たとえば、受信ポートから読み込まれるメッセージに一致するスキーマを BizTalk Server が検出できず、NACK サブスクリプションがない場合、メッセージが中断され (失敗したメッセージのルーティングが無効の場合)、NACK は生成されません。