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

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

UnresolvedVariable

קוד שגיאה

steps.assignmessage.UnresolvedVariable

גוף התשובה לשגיאה

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: unable to resolve variable [variable_name]",
        "detail": {
            "errorcode": "steps.assignmessage.UnresolvedVariable"
        }
    }
}

סיבה

השגיאה הזו מתרחשת אם משתנה שצוין במדיניות הקצאת ההודעות הוא:

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

לדוגמה, השגיאה הזו מתרחשת אם המדיניות Assign Message פועלת בתהליך הבקשה, אבל המאפיין source ברכיב <Copy> מוגדר למשתנה response או error או לכל משתנה מותאם אישית אחר שלא קיים בתהליך הבקשה.

אבחון

  1. מזהים את המדיניות להקצאת הודעות שבה אירעה השגיאה ואת שם המשתנה שלא זמין. אפשר למצוא את שני הפריטים האלה ברכיב faultstring של תגובת השגיאה.

    לדוגמה, בfaultstring הבא, שם המדיניות הוא googleBook והמשתנה הוא var:

    "faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
    
  2. בקובץ ה-XML של 'הקצאת מדיניות של הודעות' שנכשל, מוודאים ששם המשתנה שנעשה בו שימוש תואם לשם המשתנה שזוהה במחרוזת השגיאה (שלב 1 למעלה). לדוגמה, המדיניות הבאה מגדירה את מאפיין המקור ברכיב <Copy> למשתנה בשם var, שמתאים למה שמופיע ב-faultstring:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
       <DisplayName>googleBook</DisplayName>
       <Properties />
       <Copy source="var">
          <Headers>
             <Header name="user-agent" />
          </Headers>
       </Copy>
       <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
       <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
    </AssignMessage>
    
  3. בודקים אם המשתנה מוגדר וזמין בתהליך שבו המדיניות Assign Message מופעלת.

  4. אם המשתנה הוא:

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

    אז זה הגורם לשגיאה.

    לדוגמה, נניח שהמדיניות Assign Message שמוצגת למעלה פועלת בתהליך הבקשה. צריך לבדוק אם המשתנה var מוגדר באחד מכללי המדיניות שמופעלים לפני מדיניות הקצאת ההודעה בתהליך הבקשה. אם המשתנה לא הוגדר, תקבלו את קוד השגיאה:

    steps.assignmessage.UnresolvedVariable
    

רזולוציה

מוודאים שהמשתנה שמצוין במדיניות קיים וזמין בתהליך הספציפי שבו המדיניות Assign Message מופעלת.

כדי לתקן את המדיניות לדוגמה שמוצגת למעלה, אפשר לשנות את מאפיין המקור ברכיב <Copy> כך שיהיה משתנה הבקשה או כל משתנה מותאם אישית אחר מסוג הודעה שקיים בתהליך הבקשה.

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
   <DisplayName>googleBook</DisplayName>
   <Properties />
   <Copy source="request">
      <Headers>
         <Header name="user-agent" />
      </Headers>
   </Copy>
   <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
   <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>

VariableOfNonMsgType

קוד שגיאה

steps.assignmessage.VariableOfNonMsgType

גוף התשובה לשגיאה

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: value of variable [variable] is not of type Message",
        "detail": {
            "errorcode": "steps.assignmessage.VariableOfNonMsgType"
        }
    }
}

סיבה

השגיאה הזו מתקבלת אם המאפיין source ברכיב <Copy> מוגדר כמשתנה שאינו מסוג message.

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

אבחון

  1. מאתרים את מדיניות הקצאת ההודעות שבה אירעה השגיאה ואת שם המשתנה שהסוג שלו שגוי. שני הפריטים האלה מופיעים ברכיב faultstring בתשובה לשגיאה. לדוגמה, ב-faultstring הבא, שם המדיניות הוא GenerateGeocodingRequest והמשתנה הוא PostalCode:

    "faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
    
  2. בקובץ ה-XML של מדיניות הקצאת ההודעות שנכשלה, מוודאים ששם המשתנה שהוגדר באלמנט <Copy> תואם לשם המשתנה שזוהה במחרוזת השגיאה (שלב 1 למעלה). לדוגמה, המדיניות הבאה מגדירה מאפיין מקור למשתנה בשם PostalCode, שמתאים למה שמופיע ב-faultstring:

    <AssignMessage name="GenerateGeocodingRequest">
       <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
       <AssignVariable>
          <Name>PostalCode</Name>
          <Ref>request.queryparam.postalcode</Ref>
       </AssignVariable>
       <AssignVariable>
          <Name>Country</Name>
          <Ref>request.queryparam.country</Ref>
       </AssignVariable>
       <Copy source="PostalCode">
          <QueryParams>
             <QueryParam name="q" />
          </QueryParams>
       </Copy>
    </AssignMessage>
    
  3. קובעים אם המשתנה הזה הוא מסוג message או לא:

    1. מאתרים את הקוד בתוך חבילת ה-API של שרת ה-proxy, שבה המשתנה הוגדר קודם.
    2. אחרי שמזהים את המדיניות שבה המשתנה מוגדר ומאוכלס קודם, צריך לקבוע את סוג המשתנה באופן הבא:
      1. בודקים את הערך של מאפיין הסוג (אם קיים).
      2. אם מאפיין הסוג לא קיים, המשתנה נחשב למחרוזת.
    3. אם הסוג של המשתנה הוא לא הודעת (למשל מחרוזת), זו הסיבה לשגיאה. מידע על משתנים נפוצים ועל הסוגים שלהם זמין במאמר העזרה בנושא משתנים.

    לדוגמה, אפשר להסתכל על המשתנה PostalCode ב-XML שלמעלה. הוא מקבל את הערך של משתנה הזרימה request.queryparam.postalcode ברכיב <AssignVariable>. הערך הזה הוא מחרוזת, כי אין מאפיין סוג בהקצאת המשתנה.

    עכשיו, חשוב לזכור שהמשתנה PostalCode משמש את האלמנט <Copy> במדיניות Assign Message:

    <Copy source="PostalCode">
       <QueryParams>
          <QueryParam name="PostalCode" />
       </QueryParams>
    </Copy>
    

    מכיוון ש-PostalCode הוא לא מסוג message (בדוגמאות האלה הוא מחרוזת), מופיע קוד השגיאה:

    steps.assignmessage.VariableOfNonMsgType
    

רזולוציה

מוודאים שהמאפיין source ברכיב <Copy> במדיניות Assign Message שנכשלה מוגדר למשתנה תהליך מסוג message שקיים.

כדי לתקן את המדיניות, אפשר לשנות את המאפיין source באלמנט <Copy> כך שיציין משתנה מסוג message. לדוגמה, אם המדיניות Assign Message אמורה לפעול בתהליך הבקשה, אפשר להשתמש במשתנה message type‏ request או בכל משתנה מותאם אישית אחר מסוג message.

<AssignMessage name="GenerateGeocodingRequest">
   <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
   <AssignVariable>
      <Name>PostalCode</Name>
      <Ref>request.queryparam.postalcode</Ref>
   </AssignVariable>
   <AssignVariable>
      <Name>Country</Name>
      <Ref>request.queryparam.country</Ref>
   </AssignVariable>
   <Copy source="request">
      <QueryParams>
         <QueryParam name="PostalCode" />
      </QueryParams>
   </Copy>
</AssignMessage>