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

אתם צופים במסמכי העזרה של Apigee Edge.
כניסה למסמכי העזרה של Apigee X.
info

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 ותגובות HTTP שלמות. משתני התהליך המובנים של Apigee Edge,‏ request,‏ response ו-message, הם מסוג Message. מידע נוסף על משתני הודעות זמין במאמר העזר בנושא משתנים.

אבחון

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

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

    "faultstring": "Variable message.content does not resolve to a Message"
    

רזולוציה

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

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

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

סיבה: חוסר התאמה של עומס העבודה ב-XML

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

...
<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 לא תקין

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