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

כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של Apigee X.
מידע

UnresolvedVariable

קוד שגיאה

steps.assignmessage.UnresolvedVariable

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

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

סיבה

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

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

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

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

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

    זו הסיבה לשגיאה.

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

    steps.assignmessage.UnresolvedVariable
    

רזולוציה

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

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

משתנים של סוגי הודעות מייצגים את כל הבקשות והתגובות של HTTP. משתני הזרימה המובנים של Edge request, response ו-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. כך קובעים אם המשתנה הזה הוא מסוג הודעה או לא:

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

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

    עכשיו צריך לזכור שהמשתנה PostalCode משמש ברכיב <Copy> של המדיניות בנושא 'הקצאת הודעות':

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

    מאחר שמיקוד אינו מסוג הודעה (זהו מחרוזת בדוגמה זו), קיבלת את קוד השגיאה:

    steps.assignmessage.VariableOfNonMsgType
    

רזולוציה

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

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

<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>