عیب‌یابی خطای زمان اجرای «اختصاص پیام»

درحال مشاهده اسناد 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 خط‌مشی پیام واگذاری» ناموفق، تأیید کنید که نام متغیر استفاده‌شده با نام متغیر شناسایی‌شده در رشته خطا مطابقت داشته باشد (مرحله ۱ در بالا). برای مثال، خط‌مشی زیر مشخصه منبع را در عنصر <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. در «زبان نشانه‌گذاری توسعه‌پذیر خط‌مشی پیام» ناموفق «اختصاص دادن»، تأیید کنید که نام متغیر تنظیم‌شده در عنصر <Copy> با نام متغیر شناسایی‌شده در رشته خطا مطابقت داشته باشد (مرحله ۱ در بالا). برای مثال، خط‌مشی زیر مشخصه منبع را روی متغیری به نام 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» پیدا کنید، جایی که متغیر برای اولین‌بار تعریف شده است.
    2. پس‌از اینکه متوجه شدید متغیر در کدام خط‌مشی تعریف و ابتدا تکمیل می‌شود، باید نوع آن متغیر را به این صورت تعیین کنید:
      1. مقدار مشخصه نوع را (درصورت وجود) بررسی کنید.
      2. اگر مشخصه نوع وجود نداشته باشد، متغیر به‌عنوان رشته درنظر گرفته می‌شود.
    3. اگر نوع متغیر غیرپیام (مثل رشته) باشد، این دلیل خطا است. می‌توانید درباره متغیرهای رایج و انواع آن‌ها در مرجع متغیرها بیشتر بدانید.

    برای مثال، به متغیر PostalCode در XML بالا نگاه کنید. مقدار متغیر جریان request.queryparam.postalcode در عنصر <AssignVariable> به آن اختصاص داده می‌شود. این مقدار یک رشته است، زیرا مشخصه نوع در تخصیص متغیر وجود ندارد.

    اکنون به‌یاد آورید که متغیر PostalCode در عنصر <Copy> خط‌مشی «اختصاص پیام» استفاده می‌شود:

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

    ازآنجایی‌که PostalCode از نوع پیام نیست (در این مثال، رشته است)، کد خطای زیر را دریافت می‌کنید:

    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>