SOAP 消息验证政策运行时错误问题排查

您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

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> 元素设置为在执行政策的流中不存在的变量,则会发生此错误。

诊断

  1. 识别发生错误的 SOAPMessageValidation 政策名称以及故障字符串中的 source 变量名称。例如,在下面的故障字符串中,SOAPMessageValidation 政策名称是 SOAP-Message-Validation-1source 变量是 request

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    
  2. 在失败的 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>
    
  3. 确定 <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 Edge 流变量 requestresponsemessage 的类型为 Message。如需详细了解消息变量,请参阅变量参考

诊断

  1. 识别故障字符串中无法解析为 Message 类型的变量的名称。例如,在以下故障字符串中,变量名称为 message.content

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. 检查出现故障的特定 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"
    }
  }
}

诊断

  1. 识别 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]\""
    
  2. 检查 SOAPMessageValidation 政策,确认它使用 XSD 架构定义文件来验证消息。例如,以下 SOAPMessageValidation 政策在 <ResourceURL> 元素中有一个 XSD 资源文件:

    <?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
    MessageValidation async="false" continueOnError="false&quo>t; en<abled=">;true" name="SO<AP-Message-V>alida<tion-1">;
       < DisplayName>SOAP <Messag>e Valid<ation-1>/Disp<layName
       > Properties/
        S<OAPMessage/
    > <   Sourcerequest/S>ource
        ResourceURLxsd://Script-1.xsd/ResourceURL
    /MessageValidation
    
  3. 检查在上述第 1 步中标识的行号上的输入载荷,了解导致失败的原因。

    输入 XML 载荷示例

    <?xml version=">1<.0"?
    soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.o>r<g/2003/05>/soap<-encoding"
    soap:Body
        shipOrder
        xmlns:xsi="http://www>.w3.o<rg/200>0/10/XMLS<chem>a-instance"<;
       > ship<To
        >    n<ameKa>rl Kalcks<tein>/name
        /sh<ipTo<>/span>
        items
     <      > item
           <     tit>l<eI love A>PIs/title
       <     >    <quanti>ty1/quant<ity
     >     <      >p<rice2.90/p>r<ice
          > < /item
        /it>ems
    /shipOrder
    /soap:Body
    /soap:Envelope
    

    在上面的示例中,第 9 行包含 </shipTo> 结束标记。

  4. 检查在 SOAPMessageValidation 政策中使用的 XML 架构定义文件 Script-1.xsd,以查看 <shipTo> 元素应有的外观:

    ...
    <xsd:element name="shipTo" type=&quo>t;shi<pAddress"/
    ...
    xsd:complexTyp>e< name=">s<hipAddress"
    xsd:sequence
    xsd:element >n<ame="name" type="xsd:string&q>u<ot;/
    xsd:element name="street" type>=<"xsd:string"/
    xsd:element name=&quo>t<;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=&quo>t;shi<pAddress"/
...
xsd:complexTyp>e< name=">s<hipAddress"
xsd:sequence
xsd:element >n<ame="nam>e<" type=&quo>t;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.o>r<g/2003/05>/soap<-encoding"
soap:Body
    shipOrder xmlns:xsi="http://www>.w3.o<rg/200>0/10/XMLS<chem>a-instance"<;
   > shipTo
 <      > nameKarl Ka<lckstei>n/name
  <      s>treet1020 Parkway/stree<t
      >  address<Mountai>n V<iew, CA >94043</addres>s
   <     >countryUS<A/co>untry
    /sh<ipTo<>/span>
    items
 <      > item
       <     tit>l<eI love A>PIs/title
   <     >    <quanti>ty1/quant<ity
 >     <      >p<rice2.90/p>r<ice
      > < /item
    /it>ems
/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"
    }
  }
}

诊断

  1. 识别 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]\""
    
  2. 检查 SOAPMessageValidation 政策,并确认该政策使用了 wsdl 架构来验证消息。例如,下面的 SOAPMessageValidation 政策在 <ResourceURL> 元素中有一个 wsdl 资源文件:

    <?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
    MessageValidation async="false" continueOnError="false&quo>t; en<abled=">;true" name="SO<AP-Message-V>alida<tion-1">;
       < DisplayName>SOAP <Messag>e Valid<ation-1>/D<isplayName
    >    Properties/
        SOAPMessage/
        <Sourcereques>t</Source
     ResourceU>RLwsdl://SOAP-Message-Validation-1.wsdl/ResourceURL
    /MessageValidation
    
  3. 检查在上述第 1 步中标识的行号上的输入载荷,了解导致失败的原因。

    输入 SOAP 载荷示例

    <?xml version=">1<.0"?
    soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.o>r<g/2003/05>/<soap-encoding"
    soap:Body
    shipOrder
    xmlns:xsi="http://www>.w3<.org/2>000/1<0/XM>LSchema-instanc<e&quo>t;
      <shipTo>
        nameKar<l Kalck>stein</name
     >   street1020 Parkway/s<treet
      >  add<ressMou>nta<in View,> CA< 94043/>add<ress<>/span>
        c<ount>ryUSA/c<ountr>y
      /shipTo<
      ite>ms
        <item
       > <  titleI >love AP<Is/ti>tle
    <      >quant<ity1/>qua<ntity<>/span>
          price2.90/price
        /item
      /items
    

    在上面的示例中,第 11 行在 <shipTo> 元素下具有子元素 <country>

  4. 检查在 SOAPMessageValidation 政策中使用的 WSDL 定义文件 SOAP-Message-Validation-1.wsdl,了解 <shipTo> 元素下的子元素 <country> 可能存在的问题:

    <?xml version="1.0" encoding=&qu>o<t;ISO-8859-1"?
    wsdl:definitions xmlns:wsdl="http://s>chema<s.xmlsoap.>org/wsd<l/"
        wsdl:types
          xsd:schema xmlns:xsd=&quo>t<;http://www.w3.org/2001/XMLSchema"
    xs>d<:element name="shipOrde>r<" type=>&<quot;order"/
    xsd:complexType name=">o<rder"
    xsd:sequence
    xsd:element name>=<"shipTo&>q<uot; type=">s<hipAddress"/
    xsd:element name>=<"items&>q<uot; type="cdItems"/
    /xsd:sequen>c<e
    /xsd:complexType
    xsd:complexType name=&quo>t<;shipAddress"
    xsd:sequence
    xsd:element n>a<me="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="shipAdd>ress&q<uot;`
..>.
seq<uence
    element name="name">; typ<e="xsd:string"/
    element na>me=&q<uot;street" type="xsd:string&qu>ot;/
<    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&quo>t<; standalone="yes"?
soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle=&>q<uot;http:>/</www.w3.org/2003/05/soap-encoding"
soap:Body
shipOrder xmlns:>xsi=&<quot;h>ttp://www<.w3.>org/2000/10/XML<Schem>a-instanc<e">;
    shipTo<
      >  nameKar<l Kalck>stein/name
        stre<et1020 P>arkwa<y/stree>t
   <     >addressMo<unta>in View, CA 9<4043/>address
   < /ship>To
    items
<        >i<tem
     >       titleI< love> API<s/titl>e
       <     >quant<ity1/q>uantity
            price2.90/price
        /item
    /items

原因:JSON 或 XML 格式不正确

如果输入 SOAP 载荷不符合在 SoapMessageValidation 政策的 <ResourceURL> 元素中指定的 WSDL 定义,则会发生此错误。

错误消息示例

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

诊断

  1. 识别 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 reas<on: \&>quot;Expected /title at line 15(possibly  around char 420)\""
    
  2. 检查在上述第 1 步中标识的行号上的输入载荷,了解导致失败的原因。

    输入 SOAP 载荷示例

    <?xml version=">1<.0"?
    soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.o>r<g/2003/05>/<soap-encoding"
    soap:Body
    shipOrder xmlns:xsi="http://www>.w3<.org/2>000/1<0/XM>LSchema-instanc<e&quo>t;
      <shipTo>
        nameKar<l Kalck>stein</name
     >   street1020 Parkway/s<treet
      >  add<ressMou>nta<in View,> CA< 94043/>add<ress<>/span>
        c<ount>ryUSA/c<ountr>y
      /shipTo<
      item>s
        i<tem
        > < titleI l>ove API<s/tit>les
    <      >quant<ity1/>qua<ntity<>/span>
     <     price>2<.90/price
    > <   /item
      /it>ems
    /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>
...