您正在查看 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 Proxy 中,所有 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>
...