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

מטרה

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

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

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

הסיבה: מטען ייעודי (payload) של 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, את הסיבה לכישלון ואת מספר השורה שבה מטען ה-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>
...