אתם צופים במסמכי התיעוד של 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> במדיניות SOAPMessageValidation מוגדר למשתנה שלא קיים בתהליך שבו המדיניות מופעלת.
אבחון
מזהים את שם המדיניות SOAPMessageValidation שבה השגיאה מתרחשת ואת השם של המשתנה
sourceממחרוזת השגיאה. לדוגמה, במחרוזת השגיאה הבאה, שם המדיניות של SOAPMessageValidation הואSOAP-Message-Validation-1והמשתנהsourceהואrequest:"faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"ב-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>בודקים אם המשתנה שמשמש ברכיב
<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 Edge request, response ו-message הם מסוג Message. מידע נוסף על משתני הודעות זמין במאמר בנושא משתנים.
אבחון
מזהים את שם המשתנה שלא נפתר לסוג הודעה ממחרוזת השגיאה. לדוגמה, במחרוזת השגיאה הבאה, שם המשתנה הוא
message.content:"faultstring": "Variable message.content does not resolve to a Message"בודקים את כל כללי המדיניות של 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. לדוגמה, במדיניות 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 של הקלט לא תואם לסכימת ה-XSD שצוינה במדיניות SoapMessageValidation. |
| מטען ייעודי (payload) של SOAP לא תואם | מטען ה-SOAP לא עומד בהגדרת ה-WSDL שצוינה במדיניות SoapMessageValidation. |
| קובץ JSON או XML פגום | מטען ה-SOAP הייעודי (payload) של הקלט לא מכיל 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"
}
}
}
אבחון
מזהים את שם המדיניות של 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 הבאה יש קובץ משאב 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>בודקים את מטען הייעודי (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>.בודקים את קובץ ההגדרה של סכימת ה-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 תקין, אפשר לשנות את מטען ה-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"
}
}
}
אבחון
מזהים את שם המדיניות של 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 הבאה יש קובץ משאבים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>בודקים את מטען הנתונים של הקלט בשורה שזוהתה בשלב 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>.בודקים את קובץ ההגדרה של 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"
}
}
}
אבחון
מזהים את שם המדיניות של 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)\""בודקים את מטען הייעודי (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>
...