Fehlerbehebung bei der Laufzeitrichtlinie der Nachrichtenrichtlinie zur Nachrichtenüberprüfung

Sie lesen gerade die Dokumentation zu Apigee und Apigee Hybrid.
Apigee Edge-Dokumentation aufrufen.

SourceMessageNotAvailable

Fehlercode

steps.messagevalidation.SourceMessageNotAvailable

Fehlerantworttext

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

Beispieltext für eine Fehlermeldung

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

Ursache

Dieser Fehler tritt auf, wenn die im Element <Source> der SOAPMessageValidation-Richtlinie angegebene Variable message entweder:

  • außerhalb des Geltungsbereichs (nicht in dem spezifischen Ablauf verfügbar, in dem die Richtlinie ausgeführt wird) oder
  • Kann nicht aufgelöst werden (nicht definiert)

Dieser Fehler tritt beispielsweise auf, wenn für das Element <Source> in der SOAPMessageValidation-Richtlinie eine Variable festgelegt ist, die in dem Ablauf, in dem die Richtlinie ausgeführt wird, nicht vorhanden ist.

Diagnose

  1. Ermitteln Sie den Richtliniennamen der SOAPMessageValidation, in dem der Fehler auftritt, und den Namen der Variablen source aus dem Fehlerstring. Im folgenden Fehlerstring ist beispielsweise der SOAPMessageValidation-Richtlinienname SOAP-Message-Validation-1 und die Variable source ist request:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    
  2. Überprüfen Sie in der XML-Datei der fehlgeschlagenen SOAPMessageValidation-Richtlinie, ob der Name der im Element <Source> festgelegten Variable mit dem Variablennamen übereinstimmt, der im Fehlerstring angegeben ist (Schritt 1 oben).

    Beispiel: Die folgende SOAPMessageValidation-Richtlinie gibt eine Variable mit dem Namen request im Element <Source> an, die mit dem Namen im Fehlerstring übereinstimmt:

    <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. Prüfen Sie, ob die im Element <Source> verwendete Variable definiert ist, und ob sie in dem Ablauf verfügbar ist, in dem die SOAPMessageValidation-Richtlinie ausgeführt wird.

    Wenn die Variable entweder:

    • außerhalb des Gültigkeitsbereichs liegt (nicht in dem spezifischen Ablauf verfügbar ist, in dem die Richtlinie ausgeführt wird) oder
    • Kann nicht aufgelöst werden (nicht definiert)

    Dann ist dies die Ursache des Fehlers.

    Nehmen wir beispielsweise an, dass die oben aufgeführte SOAPMessageValidation-Richtlinie im Antwortablauf ausgeführt wird. Die Variable request verwendet im Element <Source>-Beispiel oben ist nur im Anfrageablauf verfügbar.

    Da die Variable request nicht im Antwortablauf vorhanden ist, erhalten Sie die folgende Fehlermeldung:

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

Lösung

Achten Sie darauf, dass die im Element <Source> der fehlgeschlagenen SOAPMessageValidation-Richtlinie festgelegte Variable definiert ist und in dem Ablauf vorhanden ist, in dem die Richtlinie ausgeführt wird.

Um das obige Beispiel zu korrigieren, können Sie das Element <Source so ändern, dass die im Antwortablauf vorhandene Variable response verwendet wird:

<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

Fehlercode

steps.messagevalidation.NonMessageVariable

Fehlerantworttext

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

Beispieltext für eine Fehlermeldung

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

Ursache

Dieser Fehler tritt auf, wenn für das Element <Source> in der SOAPMessageValidation-Richtlinie eine Variable festgelegt ist, die nicht vom Typ Message ist.

Nachrichtentypvariablen stellen ganze HTTP-Anfragen und -Antworten dar. Die integrierten Apigee-Ablaufvariablen request, response und message sind vom Typ "Message". Weitere Informationen zu Nachrichtenvariablen finden Sie in der Variablenreferenz.

Diagnose

  1. Ermitteln Sie den Namen der Variable, die nicht in einen Nachrichtentyp aus der Fehlerzeichenfolge aufgelöst wird. Im folgenden Fehlerstring lautet der Name der Variablen beispielsweise message.content:

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. Untersuchen Sie alle SOAPMessageValidation-Richtlinien im entsprechenden API-Proxy, in dem der Fehler aufgetreten ist. Es könnten eine oder mehrere SOAPMessageValidation-Richtlinien vorhanden sein. Ermitteln Sie die spezifischen SOAPMessageValidation-Richtlinien, in denen die im Element <Source> angegebene Variable mit dem im Fehlerstring angegebenen Variablennamen übereinstimmt (Schritt 1 oben).

    Die folgende Richtlinie legt beispielsweise das <Source>-Element auf eine Variable namens message.content fest, die mit dem übereinstimmt, was im Fehlerstring enthalten ist:

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

    Da die Variable message.content nicht vom Typ Message ist, erhalten Sie folgende Fehlermeldung:

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

Lösung

Achten Sie darauf, dass für das Element <Source> in der fehlgeschlagenen SOAPMessageValidation-Richtlinie eine Message-Typvariable festgelegt wurde, die in dem Ablauf vorhanden ist, in dem die Richtlinie ausgeführt wird.

Um die Richtlinie zu korrigieren, können Sie das Element <Source> so ändern, dass eine Variable vom Typ "Message" angegeben wird. In der fehlgeschlagenen Richtlinie für die MessageMessageValidation können Sie beispielsweise das Element <Source> als request angeben:

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

Fehler

Fehlercode

steps.messagevalidation.Failed

Fehlerantworttext

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

Beispieltext für eine Fehlermeldung

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

Ursache

Dieser Fehler tritt auf, wenn die SOAPMessageValidation-Richtlinie die Eingabe-Nachrichten-Nutzlast nicht gegen das XSD-Schema oder die WSDL-Definition validiert. Sie wird auch angezeigt, wenn die Nutzlastnachricht fehlerhaft formatierte JSON- oder XML-Daten enthält.

Mögliche Ursachen für diesen Fehler:

Ursache Beschreibung
Nicht übereinstimmende XML-Nutzlast Die XML-Eingabenutzlast entspricht nicht dem in der SoapMessageValidation-Richtlinie angegebenen XSD-Schema.
SOAP-Nutzlast stimmt nicht überein Die SOAP-Nutzlast der Eingabe entspricht nicht der WSDL-Definition, die in der SoapMessageValidation-Richtlinie angegeben ist.
JSON oder XML-Datei ist fehlerhaft Die Eingabe-Soap-Nutzlast enthält kein korrekt formatiertes XML oder JSON.

Ursache: Nicht übereinstimmende XML-Nutzlast

Dieser Fehler tritt auf, wenn die XML-Eingabenutzlast nicht dem XSD-Schema entspricht, das im Element <ResourceURL> der SoapMessageValidation-Richtlinie angegeben ist.

Beispiel für Fehlermeldung

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

Diagnose

  1. Ermitteln Sie den Namen der SOAPMessageValidation-Richtlinie, den Grund für den Fehler und die Zeilennummer, an der die XML-Nutzlast nicht mit dem XSD-Schema übereinstimmt. Alle diese Informationen befinden sich im Fehlerstring. Im folgenden Fehlerstring lautet beispielsweise der SOAPMessageValidation-Richtlinienname SOAP-Message-Validation-1,, der Grund für den Fehler Expecting a child element but found none [Line 9] und die Zeilennummer 9.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    
  2. Prüfen Sie die SOAPMessageValidation-Richtlinie und bestätigen Sie, dass sie eine XSD-Schemadefinitionsdatei zur Validierung von Nachrichten verwendet. Die folgende SOAPMessageValidation-Richtlinie hat beispielsweise eine XSD-Ressourcendatei im Element <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. Überprüfen Sie die Eingabenutzlast der in Schritt 1 identifizierten Zeilennummer, um die Fehlerursache zu ermitteln.

    Beispiel für XML-Nutzlast der Eingabe

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

    In dem obigen Beispiel hat Zeile 9 das End-Tag </shipTo>.

  4. Sehen Sie sich die XML-Schemadefinitionsdatei Script-1.xsd an, die in der SOAPMessageValidation-Richtlinie verwendet wird. Sie sehen dann, wie das Element <shipTo> aussehen sollte:

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

    Gemäß dem für die Validierung verwendeten XSD-Element muss das Element <shipTo> die untergeordneten Elemente <name>, <street>, <address> und <country> haben. Die XML-Nutzlast der Eingabe hat jedoch nur das untergeordnete Element <name>. Als Folge erhalten Sie folgende Fehlermeldung:

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

Lösung

Es gibt zwei Möglichkeiten, den Validationsfehler zu lösen:

Lösung 1

Wenn Sie feststellen, dass die XSD-Schemadefinition unnötige Einschränkungen aufsetzt und nur das untergeordnete Element <name> unter dem Element <shipTo> erforderlich ist, können Sie das in der Richtlinie SOAPMessageValidation verwendete Script-1.xsd ändern. Um das obige Nutzlast-Beispiel zu validieren, können Sie die XSD-Datei so ändern:

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

Lösung 2

Wenn die XSD-Definitionsdatei korrekt ist, kann die XML-Eingabenutzlast so geändert werden, dass sie mit xsd übereinstimmt. Sie können beispielsweise die Nutzlast so ändern, dass sie xsd entspricht:

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

Ursache: Nicht übereinstimmende SOAP-Nutzlast

Dieser Fehler tritt auf, wenn die SOAP-Eingabenutzlast nicht der WSDL-Definition entspricht, die im <ResourceURL>-Element der SoapMessageValidation-Richtlinie angegeben wurde.

Beispiel für Fehlermeldung

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

Diagnose

  1. Ermitteln Sie den Namen der SOAPMessageValidation-Richtlinie, den Grund für den Fehler und die Zeilennummer, an der die SOAP-Nutzlast nicht mit der WSDL-Definition übereinstimmt. Sie finden alle diese Informationen im Fehlerstring. Im folgenden Fehlerstring lautet der Name der SOAPMessageValidation-Richtlinie beispielsweise SOAP-Message-Validation-1, der Grund für den Fehler \"Element name mismatch. Wildcard? [Line 11]\"" und die Zeilennummer 11:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    
  2. Lesen Sie die Richtlinie "MessageMessageValidation" und prüfen Sie, ob die Nachrichten mit einem wsdl-Schema validiert werden. Die folgende SOAPMessageValidation-Richtlinie hat beispielsweise eine wsdl-Ressourcendatei im Element <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. Untersuchen Sie die Eingabenutzlast an der in Schritt 1 angegebenen Zeilennummer, um die Fehlerursache zu ermitteln.

    Beispiel-RPC-Nutzlast

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

    Im Beispiel oben hat Zeile 11 das untergeordnete Element <country> unter dem Element <shipTo>.

  4. Untersuchen Sie die WSDL-Definitionsdatei SOAP-Message-Validation-1.wsdl, die in der SOAPMessageValidation-Richtlinie verwendet wird, um zu sehen, was mit dem untergeordneten Element <country> unter dem Element <shipTo> fehlschlagen könnte:

    <?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>
    ...
    

    Gemäß der WSDL-Definition, die für die Validierung verwendet wird, enthält das Element <shipTo> kein untergeordnetes <country>-Element. Als Folge erhalten Sie folgende Fehlermeldung:

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

Lösung

Es gibt zwei Möglichkeiten, den Validationsfehler zu lösen:

Lösung 1

Wenn Sie feststellen, dass die verwendete WSDL-Definition falsch ist, können Sie den in der RPCMessageValidation-Richtlinie verwendete SOAP-Message-Validation-1.wsdl ändern. Um das obige Nutzlast-Beispiel zu validieren, können Sie die Datei so ändern:

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

Lösung 2

Wenn die WSDL-Definition korrekt ist, kann die SOAP-Eingabenutzlast geändert werden, damit sie der WSDL-Definition entspricht.

Beispielsweise können Sie die SOAP-Eingabenutzlast so ändern:

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

Ursache: Fehlerhafte JSON- oder XML-Datei

Dieser Fehler tritt auf, wenn die SOAP-Eingabenutzlast nicht der WSDL-Definition entspricht, die im <ResourceURL>-Element der SoapMessageValidation-Richtlinie angegeben wurde.

Beispiel für Fehlermeldung

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

Diagnose

  1. Identifizieren Sie den SOAPMessageValidation-Richtliniennamen, den Grund für den Fehler und die Zeilennummer der XML-Nutzlast, die nicht mit der WSDL-Definition übereinstimmt. Sie finden alle diese Informationen im Fehlerstring. Im folgenden Fehlerstring lautet der Name der SOAPMessageValidation-Richtlinie beispielsweise SOAP-Message-Validation-1, der Grund für den Fehler Expected </title> at line 15(possibly around char 420): und die Zeilennummer 15.:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly  around char 420)\""
    
  2. Überprüfen Sie die Eingabenutzlast der in Schritt 1 identifizierten Zeilennummer, um die Fehlerursache zu ermitteln.

    Beispiel-RPC-Nutzlast

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

    Im obigen Beispiel enthält Zeile 15 der Eingabe-XML das Element <title>, ist jedoch nicht mit einem </title>-Endtag abgeschlossen.

Lösung

Stellen Sie sicher, dass die Eingabenutzlast gültig und korrekt gebildet ist, um den Fehler zu beheben.

Beispielsweise können Sie die XML-Eingabeneingabe so ändern:

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