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
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-RichtliniennameSOAP-Message-Validation-1
und die Variablesource
istrequest
:"faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
Ü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>
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
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"
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 namensmessage.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
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 FehlerExpecting a child element but found none [Line 9]
und die Zeilennummer9
."faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
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>
Ü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>
.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
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 Zeilennummer11
:"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
Lesen Sie die Richtlinie "MessageMessageValidation" und prüfen Sie, ob die Nachrichten mit einem
wsdl
-Schema validiert werden. Die folgende SOAPMessageValidation-Richtlinie hat beispielsweise einewsdl
-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>
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>
.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
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 FehlerExpected </title> at line 15(possibly around char 420):
und die Zeilennummer15.
:"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly around char 420)\""
Ü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>
...