Risoluzione degli errori di runtime del criterio di convalida dei messaggi SOAP

Stai visualizzando la documentazione relativa a Apigee e Apigee ibrido.
Visualizza la documentazione di Apigee Edge.

SourceMessageNotAvailable

Codice di errore

steps.messagevalidation.SourceMessageNotAvailable

Corpo della risposta di errore

{
  "fault": {
    "faultstring": "source_var_name message is not
     available for[policy_name]",
    "detail": {
      "Errorcode":
       "steps.messagevalidation.SourceMessageNotAvailable"
     }
  }
}

Corpo della risposta di errore di esempio

{
  "fault": {
    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1",
    "detail": {
      "errorcode": "steps.messagevalidation.SourceMessageNotAvailable"
    }
  }
}

Causa

Questo errore si verifica se la variabile message specificata nell'elemento <Source> del criterio SOAPMessageValidation è:

  • Fuori ambito (non disponibile nel flusso specifico in cui viene eseguito il criterio) o
  • non può essere risolto (non è definito)

Ad esempio, questo errore si verifica se l'elemento <Source> nel criterio SOAPMessageValidation è impostato su una variabile che non esiste nel flusso in cui viene eseguito il criterio.

Diagnosi

  1. Identifica il nome del criterio SOAPMessageValidation in cui si verifica l'errore e il nome della variabile source dalla stringa di errore. Ad esempio, nella seguente stringa di errore, il nome del criterio SOAPMessageValidation è SOAP-Message-Validation-1 e la variabile source è request:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    
  2. Nel file XML del criterio SOAPMessageValidation non riuscito, verifica che il nome della variabile impostata nell'elemento <Source> corrisponda al nome della variabile identificato nella stringa di errore (passaggio 1 sopra).

    Ad esempio, il seguente criterio SOAPMessageValidation specifica una variabile denominata request nell'elemento <Source>, che corrisponde al contenuto della stringa di errore:

    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
        <SOAPMessage/>
        <Source>request</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    
  3. Determina se la variabile utilizzata nell'elemento <Source> è definita e disponibile nel flusso in cui viene eseguito il criterio SOAPMessageValidation.

    Se la variabile è:

    • fuori ambito (non disponibile nel flusso specifico in cui viene eseguito il criterio) o
    • non può essere risolto (non è definito)

    questa è la causa dell'errore.

    Supponiamo, ad esempio, che il criterio SOAPMessageValidation mostrato sopra venga eseguito nel flusso di risposta. Tuttavia, la variabile request utilizzata nell'esempio di elemento <Source> riportato sopra è disponibile solo nel flusso di richiesta.

    Poiché la variabile request non esiste nel flusso di risposta, viene visualizzato il seguente errore:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    

Risoluzione

Assicurati che la variabile impostata nell'elemento <Source> del criterio SOAPMessageValidation non riuscito sia definita e che esista nel flusso in cui viene eseguito il criterio.

Per correggere l'esempio mostrato sopra, puoi modificare l'elemento <Source> in modo da utilizzare la variabile response, presente nel flusso di risposta:

<MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
    <DisplayName>SOAP Message Validation-1</DisplayName>
    <Properties/>
    <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
    <SOAPMessage/>
    <Source>response</Source>
    <ResourceURL>xsd://Script-1.xsd</ResourceURL>
</MessageValidation>

NonMessageVariable

Codice di errore

steps.messagevalidation.NonMessageVariable

Corpo della risposta di errore

{
  "fault": {
    "faultstring": "Variable var_name does not resolve to a Message"
    "detail": {
      "errorcode": "steps.messagevalidation.NonMessageVariable"
    }
  }
}

Corpo di esempio della risposta di errore

{
  "fault": {
    "faultstring": "Variable message.content does not resolve to a Message",
    "detail": {
      "errorcode": "steps.messagevalidation.NonMessageVariable"
    }
  }
}

Causa

Questo errore si verifica se l'elemento <Source> nel criterio SOAPMessageValidation è impostato su una variabile che non è di tipo Message.

Le variabili del tipo di messaggio rappresentano intere richieste e risposte HTTP. Le variabili di flusso Apigee integrate request, response e message sono di tipo Message. Per saperne di più sulle variabili dei messaggi, consulta l'articolo Informazioni di riferimento sulle variabili.

Diagnosi

  1. Identifica il nome della variabile che non si risolve in un tipo di messaggio dalla stringa di errore. Ad esempio, nella seguente stringa di errore il nome della variabile è message.content:

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. Esamina tutti i criteri di SOAPMessageValidation nel proxy API specifico in cui si è verificato l'errore. Potrebbero esserci uno o più criteri SOAPMessageValidation. Identifica i criteri o i criteri SOAPMessageValidation specifici in cui la variabile specificata nell'elemento <Source> corrisponde al nome della variabile identificato nella stringa di errore (passaggio 1 sopra).

    Ad esempio, il seguente criterio consente di impostare l'elemento <Source> su una variabile denominata message.content, che corrisponde al contenuto della stringa di errore:

    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
        <SOAPMessage/>
        <Source>message.content</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    

    Poiché la variabile message.content non è di tipo Message, viene visualizzato l'errore:

    "faultstring": "Variable message.content does not resolve to a Message"
    

Risoluzione

Assicurati che l'elemento <Source> nel criterio SOAPMessageValidation non riuscito sia impostato su una variabile di tipo Message esistente nel flusso in cui viene eseguito il criterio.

Per correggere il criterio, puoi modificare l'elemento <Source> in modo da specificare una variabile di tipo Messaggio. Ad esempio, nel criterio SOAPMessageValidation non riuscito, puoi specificare l'elemento <Source> come request:

<MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
    <DisplayName>SOAP Message Validation-1</DisplayName>
    <Properties/>
    <Element namespace="http://sample.com"> sampleObject</Element>
    <SOAPMessage/>
    <Source>request</Source>
    <ResourceURL>xsd://Script-1.xsd</ResourceURL>
</MessageValidation>

Non riuscito

Codice di errore

steps.messagevalidation.Failed

Corpo della risposta di errore

{
  "fault": {
    "faultstring": "Variable var_name failed with reason: \"reason [Line varline_num
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Corpo della risposta di errore di esempio

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Causa

Questo errore si verifica se il criterio SOAPMessageValidation non riesce a convalidare il payload del messaggio di input in base allo schema XSD o alla definizione WSDL. Questo problema si verifica anche se il messaggio di payload contiene un formato JSON o XML non valido.

Di seguito sono riportate alcune delle possibili cause che possono portare a questo errore:

Causa Descrizione
Payload XML non corrispondente Il payload XML di input non è conforme allo schema XSD specificato nel criterio SoapMessageValidation.
Payload SOAP non corrispondente Il payload SOAP di input non ottempera alla definizione WSDL specificata nel criterio SoapMessageValidation.
JSON o XML non valido Il payload SOAP di input non contiene XML o JSON con formato corretto.

Causa: payload XML non corrispondente

Questo errore si verifica se il payload XML di input non ottempera allo schema XSD specificato nell'elemento <ResourceURL> del criterio SoapMessageValidation.

Messaggio di errore di esempio

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnosi

  1. Identifica il nome del criterio SOAPMessageValidation, il motivo dell'errore e il numero di riga in cui il payload XML non corrisponde allo schema XSD. Tutte queste informazioni si trovano nella stringa di errore. Ad esempio, nella seguente stringa di errore, il nome del criterio SOAPMessageValidation è SOAP-Message-Validation-1,, il motivo dell'errore è Expecting a child element but found none [Line 9] e il numero di riga è 9.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    
  2. Esamina il criterio SOAPMessageValidation e verifica che utilizzi un file di definizione dello schema XSD per convalidare i messaggi. Ad esempio, il seguente criterio SOAPMessageValidation include un file di risorse XSD nell'elemento <ResourceURL>:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <SOAPMessage/>
        <Source>request</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    
  3. Esamina il payload di input sul numero di riga identificato nel passaggio 1 sopra per capire la causa dell'errore.

    Payload XML di input di esempio

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
        <shipOrder
        xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
        <shipTo>
            <name>Karl Kalckstein</name>
        </shipTo>
        <items>
            <item>
                <title>I love APIs</title>
                <quantity>1</quantity>
                <price>2.90</price>
            </item>
        </items>
    </shipOrder>
    </soap:Body>
    </soap:Envelope>
    

    Nell'esempio mostrato sopra, la riga 9 ha il tag di fine </shipTo>.

  4. Esamina il file di definizione dello schema XML, Script-1.xsd, utilizzato nel criterio SOAPMessageValidation per vedere come dovrebbe apparire l'elemento <shipTo>:

    ...
    <xsd:element name="shipTo" type="shipAddress"/>
    ...
    <xsd:complexType name="shipAddress">
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="street" type="xsd:string"/>
    <xsd:element name="address" type="xsd:string"/>
    <xsd:element name="country" type="xsd:string"/>
    </xsd:sequence>
    </xsd:complexType>
    ...
    

    In base al campione XSD utilizzato per la convalida, l'elemento <shipTo> deve avere gli elementi secondari <name>, <street>, <address> e <country>. Tuttavia, il payload XML di input ha un solo elemento figlio, <name>. Di conseguenza, ricevi l'errore:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    

Risoluzione

Esistono due modi per risolvere questo errore di convalida:

Soluzione 1

Se determini che la definizione dello schema XSD impone limitazioni non necessarie e che è richiesto solo l'elemento secondario <name> nell'elemento <shipTo>, puoi modificare il valore Script-1.xsd utilizzato nel criterio SOAPMessageValidation. Per convalidare l'esempio di payload riportato sopra, puoi modificare il file XSD come segue:

...
<xsd:element name="shipTo" type="shipAddress"/>
...
<xsd:complexType name="shipAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>

Soluzione 2

Se il file di definizione XSD è corretto, il payload XML di input può essere modificato in modo che corrisponda a xsd. Ad esempio, potresti modificare il payload per renderlo conforme a xsd come segue:

<?xml version="1.0">
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
    <shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
    <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
    </shipTo>
    <items>
        <item>
            <title>I love APIs</title>
            <quantity>1</quantity>
            <price>2.90</price>
        </item>
    </items>
</shipOrder>
</soap:Body>
</soap:Envelope>

Causa: payload SOAP non corrispondente

Questo errore si verifica se il payload SOAP di input non ottempera alla definizione WSDL specificata nell'elemento <ResourceURL> del criterio SoapMessageValidation.

Messaggio di errore di esempio

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnosi

  1. Identifica il nome del criterio SOAPMessageValidation, il motivo dell'errore e il numero di riga in cui il payload SOAP non corrisponde alla definizione WSDL. Puoi trovare tutte queste informazioni dalla stringa di errore. Ad esempio, nella seguente stringa di errore, il nome del criterio SOAPMessageValidation è SOAP-Message-Validation-1, il motivo dell'errore è \"Element name mismatch. Wildcard? [Line 11]\"" e il numero di riga è 11:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    
  2. Esamina il criterio SOAPMessageValidation e verifica che utilizzi uno schema wsdl per convalidare i messaggi. Ad esempio, il seguente criterio SOAPMessageValidation include un file di risorse wsdl nell'elemento <ResourceURL>:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <SOAPMessage/>
        <Source>request</Source>
     <ResourceURL>wsdl://SOAP-Message-Validation-1.wsdl</ResourceURL>
    </MessageValidation>
    
  3. Esamina il payload di input sul numero di riga identificato nel passaggio 1 per capire la causa dell'errore.

    Esempio di payload SOAP di input

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
    <shipOrder
    xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
      <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
      </shipTo>
      <items>
        <item>
          <title>I love APIs</title>
          <quantity>1</quantity>
          <price>2.90</price>
        </item>
      </items>
    

    Nell'esempio mostrato sopra, la riga 11 ha l'elemento secondario <country> sotto l'elemento <shipTo>.

  4. Esamina il file di definizione WSDL, SOAP-Message-Validation-1.wsdl, utilizzato nel criterio SOAPMessageValidation per capire cosa potrebbe esserci un problema con l'elemento secondario <country> sotto l'elemento <shipTo>:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
        <wsdl:types>
          <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="shipOrder" type="order"/>
    <xsd:complexType name="order">
    <xsd:sequence>
    <xsd:element name="shipTo" type="shipAddress"/>
    <xsd:element name="items" type="cdItems"/>
    </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="shipAddress">
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="street" type="xsd:string"/>
    <xsd:element name="address" type="xsd:string"/>
    </xsd:sequence>
    ...
    

    In base alla definizione WSDL utilizzata per la convalida, l'elemento <shipTo> non ha un elemento secondario <country>. Di conseguenza, ricevi l'errore:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    

Risoluzione

Esistono due modi per risolvere questo errore di convalida:

Soluzione 1

Se ritieni che la definizione WSDL utilizzata non sia corretta, puoi modificare il valore SOAP-Message-Validation-1.wsdl utilizzato nel criterio SOAPMessageValidation. Per convalidare l'esempio di payload riportato sopra, puoi modificare il file come segue:

...
<xsd:complexType name="shipAddress">`
...
<sequence>
    <element name="name" type="xsd:string"/>
    <element name="street" type="xsd:string"/>
    <element name="address" type="xsd:string"/>
    <element name="country" type="xsd:string"/>
</sequence>

Soluzione 2

Se la definizione WSDL è corretta, il payload SOAP di input può essere modificato in modo che corrisponda alla definizione WSDL.

Ad esempio, puoi modificare il payload SOAP di input come segue:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
    <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
    </shipTo>
    <items>
        <item>
            <title>I love APIs</title>
            <quantity>1</quantity>
            <price>2.90</price>
        </item>
    </items>

Causa: formato non corretto di JSON o XML

Questo errore si verifica se il payload SOAP di input non ottempera alla definizione WSDL specificata nell'elemento <ResourceURL> del criterio SoapMessageValidation.

Messaggio di errore di esempio

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected <\/title> at line 15(possibly  around char 420)\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnosi

  1. Identifica il nome del criterio SOAPMessageValidation, il motivo dell'errore e il numero di riga del payload XML che non corrisponde alla definizione WSDL. Puoi trovare tutte queste informazioni nella stringa di errore. Ad esempio, nella seguente stringa di errore, il nome del criterio SOAPMessageValidation è SOAP-Message-Validation-1, il motivo dell'errore è Expected </title> at line 15(possibly around char 420): e il numero di riga è 15.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly  around char 420)\""
    
  2. Esamina il payload di input sul numero di riga identificato nel passaggio 1 sopra per capire la causa dell'errore.

    Esempio di payload SOAP di input

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
    <shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
      <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
      </shipTo>
      <items>
        <item>
          <title>I love APIs</titles>
          <quantity>1</quantity>
          <price>2.90</price>
        </item>
      </items>
    </shipOrder>
    </soap:Body>
    </soap:Envelope>
    

    Nell'esempio mostrato sopra, la riga 15 del codice XML di input contiene l'elemento <title> ma non è chiusa con un tag di chiusura </title>.

Risoluzione

Per risolvere l'errore, assicurati che il payload di input sia valido e formato correttamente.

Ad esempio, potresti modificare il payload XML di input come segue:

...
</shipTo>
<items>
  <item>
    <title>I love APIs</title>
    <quantity>1</quantity>
    <price>2.90</price>
  </item>
</items>
...