Condividi tramite


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