Condividi tramite


Uso dei riconoscimenti

Il motore di messaggistica BizTalk genera riconoscimenti positivi (ACK) e riconoscimenti negativi (NACK) in risposta a condizioni rilevate durante l'elaborazione di un messaggio tramite una porta. BizTalk Server pubblica un riconoscimento positivo per indicare la corretta trasmissione di un messaggio e un riconoscimento negativo per indicare l'errore di trasmissione e la sospensione di un messaggio.

Perché usare i riconoscimenti?

I riconoscimenti positivi e negativi forniscono un feedback forte che è possibile usare per determinare se un messaggio è arrivato alla destinazione o ha riscontrato uno o più problemi lungo la strada. Ad esempio, i riconoscimenti sono utili quando:

  • Si vuole monitorare una porta di ricezione per un nuovo partner commerciale per la convalida dello schema e altri errori.

  • Si vuole contrassegnare lo stato di una richiesta di prestito inviata per l'approvazione come "in corso" se viene inviata correttamente a un partner per l'approvazione o "non riuscita" se la trasmissione ha esito negativo (ad esempio, se il server del partner è inattivo).

  • Si elaborano interscambi contenenti più ordini di acquisto e si vuole tenere traccia del numero di ordini trasmessi o di trasmissione non riuscita.

    È possibile eseguire ognuno di questi scenari usando riconoscimenti e routing basato sul contenuto che usa filtri.

Riconoscimenti di routing

Quando viene pubblicato un controllo ACK o NACK, tutte le proprietà del contesto del messaggio che ha causato l'ACK/NACK vengono ridotte di livello. Le proprietà promosse non vengono trasferite alla conferma. Per instradare un riconoscimento, creare un filtro utilizzando le seguenti proprietà dello spazio dei nomi BTS :

Nome della 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 istanza dal messaggio originale.
BTS. CorrelationToken xs:string Identifica il token di correlazione dal messaggio originale, se presente.
BTS.AckDescrizione 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.

Annotazioni

Le proprietà che contengono informazioni sugli errori non sono presenti negli ACKs perché segnalano una consegna positiva.

Corpo del messaggio di riconoscimento negativo

Gran parte delle informazioni importanti su un riconoscimento positivo o negativo è contenuta nelle proprietà del contesto. Oltre alle proprietà di contesto, i NACK contengono anche una parte del 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 Soap Detail dell'elemento ErrorDescription.

Accedere al corpo del messaggio da un'orchestrazione

Se hai una porta di orchestrazione che richiede la notifica di consegna, l'eccezione DeliveryFailureException generata in caso di errore di trasmissione viene deserializzata dall'errore SOAP presente nel corpo del messaggio NACK. Per accedere alla stringa del messaggio di eccezione dall'interno dell'orchestrazione, eseguire il cast di DeliveryFailureException a soapException e quindi accedere a InnerXml, come illustrato nel codice seguente:

// 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  

L'esempio di codice precedente restituisce 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?

Entrambi i riconoscimenti positivi (ACK) e negativi (NACK) vengono pubblicati nel database MessageBox al momento dell'errore a condizione che esista almeno un abbonamento corrispondente. Ad esempio, se BizTalk Server non riesce a trovare uno schema corrispondente per un messaggio letto da una porta di ricezione e non sono presenti sottoscrizioni NACK, sospende il messaggio (se il routing dei messaggi non riuscito non è stato abilitato) e non pubblica un NACK

Vedere anche

gestione degli errori
Utilizzo del routing dei messaggi falliti