Utilizzo dei riconoscimenti
Il motore di messaggistica BizTalk genera riconoscimenti positivi (ACK) e riconoscimenti negativi (NACK) in risposta alle condizioni che si verificano durante l'elaborazione di un messaggio attraverso una porta. BizTalk Server pubblica un riconoscimento positivo per indicare l'avvenuta trasmissione di un messaggio e un riconoscimento negativo per indicare la mancata trasmissione e la sospensione di un messaggio.
Vantaggi dell'utilizzo dei riconoscimenti
I riconoscimenti positivi e negativi forniscono dei riscontri sicuri che è possibile utilizzare per determinare se un messaggio è arrivato alla destinazione o se si sono verificati uno o più problemi lungo il percorso. I riconoscimenti sono utili, ad esempio, quando:
Si desidera monitorare una porta di ricezione per un nuovo partner commerciale per quanto riguarda la convalida degli schemi e altri errori.
Si desidera contrassegnare lo stato di una richiesta di prestito inviata per l'approvazione con "in corso" se è stata inviata a un partner per l'approvazione oppure con "esito negativo" se la trasmissione non è riuscita (ad esempio se il server del partner è spento).
Si elaborano interscambi che contengono più ordini di acquisto e si desidera tenere traccia del numero di ordini per i quali la trasmissione ha avuto esito positivo o esito negativo.
Per ognuno di questi scenari è possibile utilizzare i riconoscimenti e il routing basato sul contenuto che utilizza i filtri.
Routing dei riconoscimenti
Quando viene pubblicato un ACK o un NACK, tutte le proprietà di contesto del messaggio che ha causato il riconoscimento ACK/NACK vengono abbassate di livello. Le proprietà che erano state alzate di livello non vengono indirizzate al riconoscimento. Per instradare un riconoscimento, compilare un filtro usando le proprietà seguenti dello spazio dei nomi BTS :
Nome proprietà | Tipo di dati | Descrizione |
---|---|---|
BTS.AckFailureCategory | xs:int | Identifica ErrorCategory, che fornisce la posizione e il motivo della sospensione. |
BTS.AckFailureCode | xs:string | Identifica ErrorCode, che fornisce la posizione e il motivo della sospensione. |
BTS.AckType | xs:string | Il valore è ACK per un riconoscimento positivo e NACK per un riconoscimento negativo. |
BTS.AckID | xs:string | Identifica l'ID messaggio del messaggio originale. |
BTS.AckOwnerID | xs:string | Identifica l'ID di istanza del messaggio originale. |
BTS.CorrelationToken | xs:string | Identifica il token di correlazione del messaggio originale, se presente. |
BTS.AckDescription | xs:string | Identifica errorDescription, che fornisce la posizione e il motivo della sospensione. |
BTS.AckSendPortID | xs:string | Identifica SendPortID dal messaggio originale. |
BTS.AckSendPortName | xs:string | Identifica SendPortName dal messaggio originale. |
BTS.AckOutboundTransportLocation | xs:string | Identifica OutboundTransportLocation dal messaggio originale. |
BTS.AckReceivePortID | xs:string | Identifica ReceivePortID dal messaggio originale. |
BTS.AckReceivePortName | xs:string | Identifica ReceivePortName dal messaggio originale. |
BTS.AckInboundTransportLocation | xs:string | Identifica InboundTransportLocation dal messaggio originale. |
Nota
Le proprietà che contengono le informazioni sugli errori non sono presenti nei riconoscimenti ACK, perché indicano che la consegna ha avuto luogo.
Corpo del messaggio di riconoscimento negativo
Molte delle informazioni importanti su un riconoscimento positivo o negativo sono contenute nelle proprietà di contesto. Oltre alle proprietà di contesto, nei NACK è presente una parte corpo del messaggio contenente un errore SOAP. Il formato dell'errore SOAP è il seguente:
<?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>
Il messaggio di eccezione generato dall'adapter si trova nella sezione dei dettagli SOAP nell'elemento ErrorDescription.
Accesso al corpo del messaggio da un'orchestrazione
In presenza di una porta dell'orchestrazione che richiede la notifica dei recapiti, l'eccezione DeliveryFailureException che viene generata in caso di errore di trasmissione viene deserializzata dall'errore SOAP contenuto nel corpo del messaggio NACK. Per accedere alla stringa del messaggio dell'eccezione dall'orchestrazione, eseguire il cast di DeliveryFailureException a un SoapException, quindi accedere a InnerXml, come illustrato nel seguente codice:
// 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
Nel codice di esempio precedente viene restituito un frammento XML simile al seguente:
<?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>
Quando viene pubblicato un riconoscimento
Sia i riconoscimenti positivi (ACK) che i riconoscimenti negativi (NACK) vengono pubblicati nel database MessageBox nel punto di errore, purché vi sia almeno una sottoscrizione corrispondente. Se, ad esempio, BizTalk Server non trova uno schema corrispondente per un messaggio letto da una porta di ricezione e non vi sono sottoscrizioni NACK, sospende il messaggio (se il routing dei messaggi non riusciti non è stato attivato) e non pubblica un NACK.
Vedere anche
Gestione degli errori
Utilizzo del routing dei messaggi non riusciti