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

סיבה

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

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

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

אבחון

  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 למעלה).

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

כדי לתקן את הדוגמה שלמעלה, אפשר לשנות את הרכיב <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> במדיניות SOAPMessageAuthentication מוגדר למשתנה שאינו מסוג Message.

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

אבחון

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

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

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

סיבה תיאור
מטען ייעודי (payload) לא תואם ב-XML המטען הייעודי (payload) של ה-XML שהוזן לא תואם לסכימת ה-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, את הסיבה לכשל ואת מספר השורה שבה המטען הייעודי (payload) של 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. לדוגמה, במדיניות SOAPMessageAuthentication הבאה יש קובץ משאב 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. כדי לבדוק את הדוגמה של המטען הייעודי (payload) שלמעלה, אפשר לשנות את קובץ ה-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 נכון, ניתן לשנות את המטען הייעודי (payload) של ה-XML שבקלט כך שיתאים ל-xsd. לדוגמה, אפשר לשנות את המטען הייעודי (payload) כך שיציית ל-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 להעברה לא תואם להגדרת ה-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. צריך לבדוק את המדיניות SOAPMessageAuthentication ולוודא שהיא משתמשת בסכימה 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. יש לבדוק את המטען הייעודי (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</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 נכונה, ניתן לשנות את המטען הייעודי (payload) של SOAP כך שיתאים להגדרת ה-WSDL.

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

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

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