פתרון בעיות של שגיאות בזמן ריצה במדיניות אימות הודעות SOAP

הדף הזה רלוונטי ל-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"
    }
  }
}

מטרה

השגיאה הזו מתרחשת אם המשתנה message שצוין ברכיב <Source> של מדיניות SOAPMessageValidation הוא אחד מהבאים:

  • לא נכלל בהיקף (לא זמין בתהליך הספציפי שבו המדיניות מופעלת) או
  • לא ניתן לפתור (לא מוגדר)

לדוגמה, השגיאה הזו מתרחשת אם הרכיב <Source> במדיניות SOAPMessageValidation מוגדר למשתנה שלא קיים בתהליך שבו המדיניות מופעלת.

אבחון

  1. מזהים את שם המדיניות SOAPMessageValidation שבה השגיאה מתרחשת ואת שם המשתנה source ממחרוזת השגיאה. לדוגמה, במחרוזת השגיאה הבאה, שם המדיניות SOAPMessageValidation הוא SOAP-Message-Validation-1 והמשתנה source הוא request:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    
  2. ב-XML של מדיניות SOAPMessageValidation שנכשלה, מוודאים שהשם של המשתנה שהוגדר ברכיב <Source> זהה לשם המשתנה שצוין במחרוזת השגיאה (שלב 1 למעלה).

    לדוגמה, במדיניות SOAPMessageValidation הבאה מצוין משתנה בשם request ברכיב <Source>, שתואם למה שמופיע במחרוזת השגיאה:

    <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 שמוצגת למעלה מופעלת בתהליך התגובה. עם זאת, המשתנה request שמשמש בדוגמה של רכיב <Source> שלמעלה זמין רק בתהליך הבקשה.

    מכיוון שהמשתנה request לא קיים בתהליך התגובה, מוצגת השגיאה הבאה:

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

רזולוציה

מוודאים שהמשתנה שהוגדר ברכיב <Source> של מדיניות SOAPMessageValidation שנכשלה מוגדר וקיים בתהליך שבו המדיניות מופעלת.

כדי לתקן את הדוגמה שמוצגת למעלה, אפשר לשנות את הרכיב <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"
    }
  }
}

מטרה

השגיאה הזו מתרחשת אם רכיב <Source> במדיניות SOAPMessageValidation מוגדר כמשתנה שלא שייך לסוג Message.

משתני סוג ההודעה מייצגים בקשות ותגובות מלאות של HTTP. המשתנים המובנים של Apigee flow‏ request, response ו-message הם מסוג Message. מידע נוסף על משתני הודעות זמין במאמר בנושא משתנים.

אבחון

  1. מזהים את שם המשתנה שלא נפתר לסוג הודעה ממחרוזת השגיאה. לדוגמה, במחרוזת השגיאה הבאה, שם המשתנה הוא message.content:

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. בודקים את כל כללי המדיניות של SOAPMessageValidation ב-API Proxy הספציפי שבו התרחשה השגיאה. יכול להיות שיש מדיניות אחת או יותר של 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"
    

רזולוציה

מוודאים שהרכיב <Source> במדיניות SOAPMessageValidation שנכשלה מוגדר למשתנה מסוג Message שקיים בתהליך שבו המדיניות מופעלת.

כדי לתקן את המדיניות, אפשר לשנות את רכיב <Source> כדי לציין משתנה מסוג Message. לדוגמה, במדיניות failed 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 נכשלת באימות של מטען הייעודי (payload) של הודעת הקלט מול סכמת ה-XSD או הגדרת ה-WSDL. היא תתרחש גם אם יש JSON או XML לא תקינים בהודעת מטען הייעודי.

אלה כמה מהסיבות האפשריות לשגיאה הזו:

מטרה תיאור
מטען ייעודי (payload) של XML לא תואם מטען ה-XML הייעודי (payload) של הקלט לא תואם לסכימת ה-XSD שצוינה במדיניות SoapMessageValidation.
מטען ייעודי (payload) של SOAP לא תואם המטען הייעודי (payload) של קלט SOAP לא תואם להגדרת ה-WSDL שצוינה במדיניות SoapMessageValidation.
פורמט לא תקין של JSON או XML המטען הייעודי (payload) של קלט SOAP לא מכיל XML או JSON בפורמט תקין.

הסיבה: נתוני XML לא תואמים

השגיאה הזו מתרחשת אם מטען ה-XML של הקלט לא תואם לסכמת ה-XSD שצוינה ברכיב <ResourceURL> של מדיניות SoapMessageValidation.

הודעת שגיאה לדוגמה

{
  "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 הבאה יש קובץ משאב XSD באלמנט<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. בודקים את מטען הייעודי (payload) של הקלט במספר השורה שזוהה בשלב 1 למעלה כדי להבין מה גרם לכשל.

    דוגמה למטען ייעודי (payload) של קלט בפורמט 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>.

  4. בודקים את קובץ ההגדרה של סכימת ה-XML, ‏ Script-1.xsd, שמשמש במדיניות SOAPMessageValidation כדי לראות איך רכיב <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 מטילה מגבלות מיותרות ונדרש רק רכיב הצאצא <name> מתחת לרכיב <shipTo>, אתם יכולים לשנות את Script-1.xsd שמשמש במדיניות SOAPMessageValidation. כדי לאמת את מטען הייעודי לדוגמה שלמעלה, אתם יכולים לשנות את קובץ ה-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>

הסיבה: מטען ייעודי (payload) של SOAP לא תואם

השגיאה הזו מתרחשת אם מטען ה-SOAP לא תואם להגדרת ה-WSDL שצוינה ברכיב <ResourceURL> של מדיניות SoapMessageValidation.

הודעת שגיאה לדוגמה

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

אבחון

  1. מזהים את שם המדיניות של SOAPMessageValidation, את הסיבה לכישלון ואת מספר השורה שבה מטען ייעודי (payload) של ה-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 הבאה יש קובץ משאבים wsdl באלמנט <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. בודקים את מטען הייעודי למטרה של הקלט בשורה שזוהתה בשלב 1 כדי להבין מה גרם לכשל.

    מטען ייעודי (payload) לדוגמה של 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 יש את רכיב הצאצא <country> מתחת לרכיב <shipTo>.

  4. בודקים את קובץ ההגדרה של WSDL‏, SOAP-Message-Validation-1.wsdl, שמשמש במדיניות SOAPMessageValidation כדי לראות מה יכול להיות לא בסדר ברכיב הצאצא <country> מתחת לרכיב <shipTo>:

    <?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 שבה נעשה שימוש שגויה, אפשר לשנות את SOAP-Message-Validation-1.wsdl שנעשה בו שימוש במדיניות SOAPMessageValidation. כדי לאמת את דוגמת המטען הייעודי (Payload) שלמעלה, אפשר לשנות את הקובץ באופן הבא:

...
<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 הייעודי (Payload) של הקלט באופן הבא:

<?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 לא תואם להגדרת ה-WSDL שצוינה ברכיב <ResourceURL> של מדיניות SoapMessageValidation.

הודעת שגיאה לדוגמה

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

אבחון

  1. מזהים את שם המדיניות SOAPMessageValidation, את הסיבה לכשל ואת מספר השורה של מטען ה-XML שלא תואם להגדרת ה-WSDL. כל המידע הזה מופיע במחרוזת השגיאה. לדוגמה, במחרוזת השגיאה הבאה, שם המדיניות של 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)\""
    
  2. בודקים את מטען הייעודי (payload) של הקלט במספר השורה שזוהה בשלב 1 למעלה כדי להבין מה גרם לכשל.

    מטען ייעודי (payload) לדוגמה של 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>
    

    בדוגמה שמוצגת למעלה, בשורה 15 של קובץ ה-XML של הקלט יש את הרכיב <title> אבל הוא לא נסגר בתג הסיום </title>.

רזולוציה

כדי לפתור את השגיאה, צריך לוודא שהמטען הייעודי (payload) של הקלט תקין ומורכב בצורה נכונה.

לדוגמה, אפשר לשנות את מטען ה-XML הייעודי של הקלט באופן הבא:

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