승인 사용
BizTalk 메시징 엔진은 포트를 통한 메시지 처리 중에 발생한 상황에 대한 응답으로 긍정 승인(ACK) 및 부정 승인(NACK)을 생성합니다. BizTalk Server는 성공적인 메시지 전송을 나타내기 위해 긍정 승인을 게시하고 메시지의 전송 실패 및 일시 중단을 나타내기 위해 부정 승인을 게시합니다.
승인을 사용하는 이유
긍정 및 부정 승인은 메시지가 대상 위치에 도착했는지 아니면 중간에 문제가 발생했는지 확인하는 데 사용할 수 있는 강력한 피드백을 제공합니다. 예를 들어 다음 경우에 승인이 유용할 수 있습니다.
새 거래 업체의 수신 포트를 모니터링하여 스키마 유효성 검사 결과 및 기타 오류를 확인할 수 있습니다.
대부 요청이 승인을 받기 위해 파트너에게 성공적으로 전송되면 요청의 상태를 "in process"로 표시하고 파트너 서버가 다운된 경우처럼 전송이 실패하면 "failed"로 표시할 수 있습니다.
여러 구매 주문서를 교환하면서 제대로 전송된 주문서의 수와 전송되지 못한 주문서의 수를 추적할 수 있습니다.
승인 기능과 필터를 사용하는 콘텐츠 기반 라우팅을 사용하여 이러한 각 시나리오를 완료할 수 있습니다.
승인 라우팅
ACK 또는 NACK가 게시되면 메시지에서 ACK/NACK를 발생시킨 모든 메시지 컨텍스트 속성이 강등됩니다. 승격된 속성은 승인으로 흐르지 않습니다. 승인을 라우팅하려면 BTS 네임스페이스의 다음 속성을 사용하여 필터를 빌드합니다.
속성 이름 | 데이터 형식 | Description |
---|---|---|
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 을 식별합니다. |
참고
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 Detail 섹션에 나옵니다.
오케스트레이션에서 메시지 본문 액세스
배달 알림을 필요로 하는 오케스트레이션 포트를 사용할 경우 전송 실패 시 throw된 DeliveryFailureException이 NACK 메시지 본문에 포함된 SOAP 오류에서 deserialize됩니다. 오케스트레이션에서 예외 메시지 문자열에 액세스하려면 다음 코드와 같이 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 등록이 없으면 BizTalk Server는 메시지를 일시 중단하고(실패한 메시지 라우팅이 설정되지 않은 경우) NACK를 게시하지 않습니다.