您正在查看 Apigee 和 Apigee Hybrid 文档。
查看 Apigee Edge 文档。
SourceMessageNotAvailable
错误代码
steps.messagevalidation.SourceMessageNotAvailable
错误响应正文
{ "fault": { "faultstring": "source_var_name message is not available for[policy_name]", "detail": { "Errorcode": "steps.messagevalidation.SourceMessageNotAvailable" } } }
错误响应正文示例
{
"fault": {
"faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1",
"detail": {
"errorcode": "steps.messagevalidation.SourceMessageNotAvailable"
}
}
}
原因
如果在 SOAPMessageValidation 政策的 <Source>
元素中指定的 message 变量出现下列其中一种情况,则会发生此错误:
- 超出范围(在执行政策的特定流中不可用)
- 无法解析(未定义)
例如,如果将 SOAPMessageValidation 政策中的 <Source>
元素设置为在执行政策的流中不存在的变量,则会发生此错误。
诊断
识别发生错误的 SOAPMessageValidation 政策名称以及故障字符串中的
source
变量名称。例如,在下面的故障字符串中,SOAPMessageValidation 政策名称是SOAP-Message-Validation-1
,source
变量是request
:"faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
在失败的 SOAPMessageValidation 政策 XML 中,验证在
<Source>
元素中设置的变量的名称是否与故障字符串中标识(上述第 1 步)的变量名称相匹配。例如,以下 SOAPMessageValidation 政策在
<Source>
元素中指定了一个名为request
的变量,该变量与故障字符串中的内容匹配:<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>
确定
<Source>
元素中使用的变量是否已定义,以及在执行 SOAPMessageValidation 政策的流中是否可用。如果该变量:
- 超出范围(在执行政策的特定流中不可用)
- 无法解析(未定义)
就会导致错误。
例如,假设上面所示的 SOAPMessageValidation 政策在响应流中执行。但是,上面
<Source>
元素示例中使用的request
变量只能在请求流中使用。因为响应流中不存在
request
变量,所以您会收到以下错误:"faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
解决方法
确保在失败的 SOAPMessageValidation 政策的 <Source>
元素中设置的变量已定义,且存在于政策执行的流中。
如需更正上面所示的示例,您可以修改 <Source
> 元素以使用 response
变量(它在响应流中):
<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
错误代码
steps.messagevalidation.NonMessageVariable
错误响应正文
{ "fault": { "faultstring": "Variable var_name does not resolve to a Message" "detail": { "errorcode": "steps.messagevalidation.NonMessageVariable" } } }
错误响应正文示例
{
"fault": {
"faultstring": "Variable message.content does not resolve to a Message",
"detail": {
"errorcode": "steps.messagevalidation.NonMessageVariable"
}
}
}
原因
如果将 SOAPMessageValidation 政策中的 <Source>
元素设为不是 Message 类型的变量,则会发生此错误。
消息类型变量表示整个 HTTP 请求和响应。内置 Apigee 流变量 request
、response
和 message
都属于 Message 类型。如需详细了解消息变量,请参阅变量参考。
诊断
识别故障字符串中无法解析为 Message 类型的变量的名称。例如,在以下故障字符串中,变量名称为
message.content
:"faultstring": "Variable message.content does not resolve to a Message"
检查出现故障的特定 API 代理中的所有 SOAPMessageValidation 政策。可能有一个或多个 SOAPMessageValidation 政策。标识一个或多个 SOAPMessageValidation 政策,在其中,在
<Source>
元素中指定的变量与故障字符串中标识的变量名称(上述第 1 步)相匹配。例如,以下政策将
<Source>
元素设置为名为message.content
的变量,该变量与故障字符串中的变量相匹配:<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>
由于变量
message.content
不是 Message 类型,因此您会收到以下错误:"faultstring": "Variable message.content does not resolve to a Message"
解决方法
确保失败的 SOAPMessageValidation 政策中的 <Source>
元素设置为在政策执行的流中存在的 Message 类型变量。
如需更正该政策,您可以修改 <Source>
元素来指定类型为 Message 的变量。例如,在失败的 SOAPMessageValidation 政策中,您可能将 <Source>
元素指定为 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>
失败
错误代码
steps.messagevalidation.Failed
错误响应正文
{ "fault": { "faultstring": "Variable var_name failed with reason: \"reason [Line varline_num "detail": { "errorcode": "steps.messagevalidation.Failed" } } }
错误响应正文示例
{
"fault": {
"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
"detail": {
"errorcode": "steps.messagevalidation.Failed"
}
}
}
原因
如果 SOAPMessageValidation 政策未能根据 XSD 架构或 WSDL 定义验证输入消息载荷,则会发生此错误。如果载荷消息中存在格式不正确的 JSON 或 XML 格式,也会发生此错误。
以下是可能导致此错误的一些可能原因:
原因 | 说明 |
XML 载荷不匹配 | 输入 XML 载荷不符合在 SoapMessageValidation 政策中指定的 XSD 架构。 |
SOAP 载荷不匹配 | 输入 SOAP 载荷不符合在 SoapMessageValidation 政策中指定的 WSDL 定义。 |
JSON 或 XML 格式不正确 | 输入 SOAP 载荷不包含格式正确的 XML 或 JSON。 |
原因:XML 载荷不匹配
如果输入 XML 载荷不符合在 SoapMessageValidation 政策的 <ResourceURL>
元素中指定的 XSD 架构,则会发生此错误。
错误消息示例
{
"fault": {
"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
"detail": {
"errorcode": "steps.messagevalidation.Failed"
}
}
}
诊断
识别 SOAPMessageValidation 政策名称、失败的原因以及 XML 载荷与 XSD 架构不匹配的行号。所有这些信息都存在于故障字符串中。例如,在下面的故障字符串中,SOAPMessageValidation 政策名称是
SOAP-Message-Validation-1,
,失败的原因是Expecting a child element but found none [Line 9]
,行号是9
。"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
检查 SOAPMessageValidation 政策,确认它使用 XSD 架构定义文件来验证消息。例如,以下 SOAPMessageValidation 政策在
<ResourceURL>
元素中有一个 XSD 资源文件:<?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>
检查在上述第 1 步中标识的行号上的输入载荷,了解导致失败的原因。
输入 XML 载荷示例
<?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>
在上面的示例中,第 9 行包含
</shipTo>
结束标记。检查在 SOAPMessageValidation 政策中使用的 XML 架构定义文件
Script-1.xsd
,以查看<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> ...
根据用于验证的 XSD 示例,
<shipTo>
元素必须具有子元素<name>
、<street>
、<address>
和<country>
。但是,输入 XML 载荷只有一个子元素<name>
。因此,您将收到以下错误:"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
解决方法
有两种解决验证错误的方法:
解决方法 #1
如果您确定 XSD 架构定义施加了不必要的限制,但 <shipTo>
元素下只有 <name>
子元素,则可以修改在 SOAPMessageValidation 政策中使用的 Script-1.xsd
。如需验证上面的载荷示例,您可以按如下所示修改该 XSD 文件:
...
<xsd:element name="shipTo" type="shipAddress"/>
...
<xsd:complexType name="shipAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
解决方法 #2
如果 XSD 定义文件正确无误,则可以更改输入 XML 载荷,以与 xsd
相匹配。例如,您可以按如下所示修改载荷,使其符合 xsd
:
<?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>
原因:SOAP 载荷不匹配
如果输入 SOAP 载荷不符合在 SoapMessageValidation 政策的 <ResourceURL>
元素中指定的 WSDL 定义,则会发生此错误。
错误消息示例
{
"fault": {
"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\"",
"detail": {
"errorcode": "steps.messagevalidation.Failed"
}
}
}
诊断
识别 SOAPMessageValidation 政策名称、失败的原因以及 SOAP 载荷与 WSDL 定义不匹配的行号。您可以从故障字符串中找到所有这些信息。例如,在下面的故障字符串中,SOAPMessageValidation 政策名称是
SOAP-Message-Validation-1
,失败的原因是\"Element name mismatch. Wildcard? [Line 11]\""
,行号是11
:"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
检查 SOAPMessageValidation 政策,并确认该政策使用了
wsdl
架构来验证消息。例如,下面的 SOAPMessageValidation 政策在<ResourceURL>
元素中有一个wsdl
资源文件:<?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>
检查在上述第 1 步中标识的行号上的输入载荷,了解导致失败的原因。
输入 SOAP 载荷示例
<?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>
在上面的示例中,第 11 行在
<shipTo>
元素下具有子元素<country>
。检查在 SOAPMessageValidation 政策中使用的 WSDL 定义文件
SOAP-Message-Validation-1.wsdl
,了解<shipTo>
元素下的子元素<country>
可能存在的问题:<?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> ...
根据用于验证的 WSDL 定义,
<shipTo>
元素缺少<country>
子元素。因此,您将收到以下错误:"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
解决方法
有两种解决验证错误的方法:
解决方法 #1
如果您确定使用的 WSDL 定义不正确,则可以更改在 SOAPMessageValidation 政策中使用的 SOAP-Message-Validation-1.wsdl
。如需验证上面的载荷示例,您可以按如下所示修改该文件:
...
<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>
解决方法 #2
如果 WSDL 定义正确,则可以更改 SOAP 载荷以与 WSDL 定义相匹配。
例如,您可以按如下所示修改输入 SOAP 载荷:
<?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>
原因:JSON 或 XML 格式不正确
如果输入 SOAP 载荷不符合在 SoapMessageValidation 政策的 <ResourceURL>
元素中指定的 WSDL 定义,则会发生此错误。
错误消息示例
{
"fault": {
"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected <\/title> at line 15(possibly around char 420)\"",
"detail": {
"errorcode": "steps.messagevalidation.Failed"
}
}
}
诊断
识别 SOAPMessageValidation 政策名称、失败的原因以及与 WSDL 定义不匹配的 XML 载荷的行号。您可以在故障字符串中找到所有这些信息。例如,在下面的故障字符串中,SOAPMessageValidation 政策名称是
SOAP-Message-Validation-1
,失败的原因是Expected </title> at line 15(possibly around char 420):
,行号是15.
"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly around char 420)\""
检查在上述第 1 步中标识的行号上的输入载荷,了解导致失败的原因。
输入 SOAP 载荷示例
<?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>
在上面的示例中,输入 XML 的第 15 行包含
<title>
元素,但不是以</title>
结束标记结尾。
解决方法
如需解决该错误,请确保输入载荷有效且格式正确。
例如,您可以按如下所示修改输入 XML 载荷:
...
</shipTo>
<items>
<item>
<title>I love APIs</title>
<quantity>1</quantity>
<price>2.90</price>
</item>
</items>
...