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