הדף הזה רלוונטי ל-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 מוגדר למשתנה שלא קיים בתהליך שבו המדיניות מופעלת.
אבחון
מזהים את שם המדיניות 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 flow 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. לדוגמה, במדיניות 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"
}
}
}
אבחון
מזהים את שם המדיניות של 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. כדי לאמת את מטען הייעודי לדוגמה שלמעלה, אתם יכולים לשנות את קובץ ה-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, את הסיבה לכישלון ואת מספר השורה שבה מטען ייעודי (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]\""בודקים את מדיניות 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>
...