عیب‌یابی خطای زمان اجرای «نوشته راهنمای خدمات»

درحال مشاهده اسناد Apigee Edge هستید.
به اسناد Apigee X بروید.
اطلاعات

RequestVariableNotMessageType

کد خطا

steps.servicecallout.RequestVariableNotMessageType

متن پاسخ خطا

{
    "fault": {
        "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Message",
        "detail": {
            "errorcode": "steps.servicecallout.RequestVariableNotMessageType"
        }
    }
}

علت

این خطا زمانی رخ می‌دهد که متغیری که در عنصر <Request> از خط‌مشی «نوشته راهنمای تماس با سرویس» مشخص شده است از نوع پیام نباشد. اگر متغیر رشته یا هر نوع غیرپیامی باشد، این خطا را خواهید دید.

متغیرهای نوع پیام نشان‌دهنده کل درخواست‌ها و پاسخ‌های HTTP هستند. متغیرهای جریان داخلی Edge request، response، و message از نوع پیام هستند. برای کسب اطلاعات بیشتر درباره متغیرهای پیام، به مرجع متغیرها مراجعه کنید.

تشخیص

  1. خط‌مشی «نوشته راهنمای تماس با خدمات» را که خطا در آن رخ داده است و نام متغیری را که نوع آن نادرست است شناسایی کنید. هر دوی این موارد را می‌توانید در عنصر faultstring پاسخ خطا پیدا کنید. برای مثال، در faultstring زیر، نام خط‌مشی ExecuteGeocodingRequest و متغیر PostalCode است:

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable PostalCode value is not of type Message"

  2. در XML خط‌مشی «نوشته راهنمای تماس با خدمات» ناموفق، بررسی کنید که نام متغیر تنظیم‌شده در عنصر <Request> با نام متغیر شناسایی‌شده در رشته خطا مطابقت داشته باشد (مرحله ۱ در بالا). برای مثال، خط‌مشی زیر متغیر درخواست با نام PostalCode را مشخص می‌کند که با آنچه در faultstring است مطابقت دارد:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="PostalCode"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    
  3. تعیین کنید که آیا این متغیر از نوع پیام است یا نه:

    1. کد را در بسته «پراکسی API» پیدا کنید، جایی که متغیر برای اولین‌بار تعریف شده است.
    2. در اکثر موارد، متوجه خواهید شد که متغیر مشکل در خط‌مشی دیگری که قبل‌از خط‌مشی «نوشته راهنمای تماس با خدمات» اجرا می‌شود ایجاد و تکمیل شده است. برای مثال، خط‌مشی «تخصیص پیام» معمولاً برای ایجاد و پر کردن متغیرها در جریان پراکسی API استفاده می‌شود.
    3. پس‌از اینکه متوجه شدید متغیر در کدام خط‌مشی تعریف و ابتدا تکمیل می‌شود، باید نوع آن متغیر را به این صورت تعیین کنید:
      • مقدار مشخصه type را (درصورت وجود) بررسی کنید.
      • اگر مشخصه type وجود نداشته باشد، متغیر رشته درنظر گرفته می‌شود.
    4. اگر نوع متغیر غیرپیام (مثل رشته) باشد، این دلیل خطا است. می‌توانید درباره متغیرهای رایج و انواع آن‌ها در مرجع متغیرها بیشتر بدانید.

به‌عنوان مثال، فرض کنید متغیر PostalCode که در خط‌مشی «نوشته راهنمای تماس با خدمات» ارجاع داده شده است در خط‌مشی «اختصاص پیام» زیر ایجاد شده است. توجه داشته باشید که مقدار متغیر جریان request.queryparam.postalcode به PostalCode اختصاص داده شده است. این مقدار رشته‌ای است، زیرا مشخصه type در تخصیص متغیر وجود ندارد.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
        <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
    <Set>
        <QueryParams>
            <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
            <QueryParam name="region">{request.queryparam.country}</QueryParam>
            <QueryParam name="sensor">false</QueryParam>
        </QueryParams>
        <Verb>GET</Verb>
    </Set>
    <AssignVariable>
        <Name>PostalCode</Name>
        <Ref>request.queryparam.postalcode</Ref>
    </AssignVariable>
    <AssignVariable>
        <Name>Country</Name>
        <Ref>request.queryparam.country</Ref>
    </AssignVariable>
</AssignMessage>

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="PostalCode"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

چون PostalCode از نوع پیام نیست (در این مثال، رشته است)، کد خطای steps.servicecallout.RequestVariableNotMessageType را دریافت می‌کنید.

وضوح

مطمئن شوید مجموعه متغیر در عنصر <Request> در خط‌مشی «نوشته راهنمای سرویس» ناموفق متغیر جاری نوع پیام است که وجود دارد یا می‌توانید متغیر نوع پیام جدیدی را مستقیماً در خط‌مشی «نوشته راهنمای سرویس» (همان‌طور که در سند خط‌مشی توضیح داده شده است) ایجاد کنید و از آن استفاده کنید.

برای اصلاح خط‌مشی، باید عنصر <Request> را تغییر دهید تا متغیر موجود یا جدیدی را که از نوع پیام است مشخص کنید. برای مثال، متغیر GeocodingRequest که در خط‌مشی «اختصاص پیام» تنظیم شده است از نوع پیام است و در خط‌مشی «نوشته راهنمای تماس با خدمات» به‌خوبی کار می‌کند. برای مثال:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

RequestVariableNotRequestMessageType

کد خطا

steps.servicecallout.RequestVariableNotRequestMessageType

متن پاسخ خطا

{
    "fault": {
        "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Request Message",
        "detail": {
            "errorcode": "steps.servicecallout.RequestVariableNotRequestMessageType"
        }
    }
}

علت

این خطا زمانی رخ می‌دهد که متغیری که در عنصر <Request> از خط‌مشی «دعوت به اقدام سرویس» مشخص شده است از نوع پیام درخواست نباشد. اگر متغیر از نوع پیام پاسخ، رشته، یا هر نوع دیگری باشد، این خطا را خواهید دید.

متغیرهای نوع پیام نشان‌دهنده کل درخواست‌ها و پاسخ‌های HTTP هستند. متغیرهای جریان داخلی Edge request، response، و message از نوع پیام هستند. برای کسب اطلاعات بیشتر درباره متغیرهای پیام، به مرجع متغیرها مراجعه کنید.

تشخیص

  1. خط‌مشی «نوشته راهنمای تماس با خدمات» را که خطا در آن رخ داده است و نام متغیری را که نوع آن نادرست است شناسایی کنید. هر دوی این موارد را می‌توانید در عنصر faultstring پاسخ خطا پیدا کنید. برای مثال، در faultstring زیر، نام خط‌مشی ExecuteGeocodingRequest و متغیر var_response است:

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable var_response value is not of type Message"

  2. در XML خط‌مشی «نوشته راهنمای تماس با خدمات» ناموفق، بررسی کنید که نام متغیر تنظیم‌شده در عنصر <Request> با نام متغیر شناسایی‌شده در رشته خطا مطابقت داشته باشد (مرحله ۱ در بالا). برای مثال، خط‌مشی زیر متغیر درخواست با نام var_response را مشخص می‌کند که با آنچه در faultstring است مطابقت دارد:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="var_response"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    
  3. تعیین کنید که متغیر از نوع پیام درخواست است یا نه:

    1. کد را در بسته «پراکسی API» پیدا کنید، جایی که متغیر برای اولین‌بار تعریف شده است.
    2. در اکثر موارد، متوجه خواهید شد که متغیر مشکل در خط‌مشی دیگری که قبل‌از خط‌مشی «نوشته راهنمای تماس با خدمات» اجرا می‌شود ایجاد و تکمیل شده است. برای مثال، خط‌مشی «تخصیص پیام» معمولاً برای ایجاد و پر کردن متغیرها در جریان پراکسی API استفاده می‌شود.
    3. پس‌از اینکه متوجه شدید متغیر در کدام خط‌مشی تعریف و ابتدا تکمیل می‌شود، باید نوع آن متغیر را به این صورت تعیین کنید:
      • مقدار مشخصه type را (درصورت وجود) بررسی کنید.
      • اگر مشخصه type وجود نداشته باشد، متغیر رشته درنظر گرفته می‌شود.
    4. اگر نوع متغیر از نوع پیام درخواست نباشد، این دلیل خطا است. می‌توانید درباره متغیرهای رایج و انواع آن‌ها در مرجع متغیرها بیشتر بدانید.

به‌عنوان مثال، فرض کنید متغیر var_response که در خط‌مشی «نوشته راهنمای تماس با خدمات» ارجاع داده شده است در خط‌مشی «اختصاص پیام» زیر ایجاد شده است. توجه داشته باشید که نوع response به var_response داده شده است. بنابراین، نوع متغیر var_response پیام پاسخ است.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
        <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
    <AssignTo createNew="true" type="response">var_response</AssignTo>
    <Set>
        <QueryParams>
            <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
            <QueryParam name="region">{request.queryparam.country}</QueryParam>
            <QueryParam name="sensor">false</QueryParam>
        </QueryParams>
        <Verb>GET</Verb>
    </Set>
    <AssignVariable>
        <Name>PostalCode</Name>
        <Ref>request.queryparam.postalcode</Ref>
    </AssignVariable>
    <AssignVariable>
        <Name>Country</Name>
        <Ref>request.queryparam.country</Ref>
    </AssignVariable>
</AssignMessage>

به‌یاد داشته باشید که متغیر var_response در عنصر <Request> خط‌مشی «نوشته راهنمای خدمات» استفاده می‌شود.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="var_response"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

چون var_response از نوع پیام درخواست نیست (نوع آن پیام پاسخ است)، کد خطای steps.servicecallout.RequestVariableNotRequestMessageType را دریافت می‌کنید.

وضوح

مطمئن شوید مجموعه متغیر در عنصر <Request> در خط‌مشی «نوشته راهنمای تماس با سرویس» ناموفق از نوع متغیر پیام درخواست باشد که وجود دارد یا می‌توانید مستقیماً در خط‌مشی «نوشته راهنمای تماس با سرویس» متغیر نوع پیام درخواست جدیدی ایجاد کنید (همان‌طور که در سند خط‌مشی توضیح داده شده است) و از آن استفاده کنید.

برای اصلاح خط‌مشی، باید عنصر <Request> را تغییر دهید تا متغیر موجود یا جدیدی را که از نوع پیام درخواست است مشخص کنید، و این کار در خط‌مشی «نوشته راهنمای تماس با سرویس» کار خواهد کرد. برای مثال:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

ExecutionFailed

کد خطا

steps.servicecallout.ExecutionFailed

متن پاسخ خطا

{
    "fault": {
        "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: Host not reachable",
        "detail": {
            "errorcode": "steps.servicecallout.ExecutionFailed"
        }
    }
}

یا

{
    "fault": {
        "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: ResponseCode [http_code] is treated as error",
        "detail": {
            "errorcode": "steps.servicecallout.ExecutionFailed"
        }
    }
}

علل احتمالی

دلایل احتمالی این خطا عبارت‌اند از:

علت شرح
نشانی وب نامعتبر یا ناقص نشانی وب هدف در خط‌مشی «نوشته راهنمای تماس با خدمات» ناقص است یا نام میزبان نامعتبر یا غیرقابل‌دسترس دارد.
خطای سرور زیرینه سرور زیرینه پاسخ خطای 4XX یا 5XX برمی‌گرداند.

علت: نشانی وب نامعتبر یا قالب اشتباه

نشانی وب هدف در خط‌مشی «نوشته راهنمای تماس با خدمات» ناقص است یا نام میزبان نامعتبر یا غیرقابل‌دسترس دارد.

تشخیص

  1. خط‌مشی «نوشته راهنمای سرویس» را که باعث بروز خطا شده است شناسایی کنید. نام خط‌مشی در عنصر faultstring پاسخ خطا نشان داده می‌شود. برای مثال، در faultstring زیر، نام خط‌مشی «نوشته راهنمای تماس با سرویس» ناموفق ExecuteGeocodingRequest است.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. در خط‌مشی «نوشته راهنمای خدمات» ناموفق، عنصر <URL> را بررسی کنید. اگر این نشانی وب بدفرم باشد یا نام میزبان نامعتبر یا غیرقابل‌دسترسی داشته باشد، دلیل این خطا همین است. برای مثال، خط‌مشی «نوشته راهنمای تماس با خدمات» زیر <URL> نامعتبر را مشخص می‌کند:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="GeocodingRequest"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    

    عنصر <URL> فقط پروتکل http:// را دارد، اما نام میزبان معتبری ندارد؛ بنابراین، خط‌مشی «خدمات پیام‌واره» با این خطا ناموفق است: Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable.

وضوح

مطمئن شوید که عنصر <URL> در خط‌مشی «نوشته راهنمای تماس با خدمات» ناموفق نشانی وب معتبری با نام میزبان قابل‌دسترسی داشته باشد.

برای اصلاح کردن خط‌مشی «نوشته راهنمای تماس با خدمات» که در بالا نشان داده شده است، می‌توانید عنصر <URL> را اصلاح کنید تا نشانی وب معتبری را مشخص کنید:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

علت: خطای سرور زیرینه

سرور زیرینه پاسخ خطای 4XX یا 5XX برمی‌گرداند.

تشخیص

  1. خط‌مشی «نوشته راهنمای سرویس» را که باعث بروز خطا شده است شناسایی کنید. نام خط‌مشی در عنصر faultstring پاسخ خطا نشان داده می‌شود. برای مثال، در faultstring زیر، نام خط‌مشی «نوشته راهنمای تماس با سرویس» ناموفق ExecuteGeocodingRequest است.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. faultstring را در بدنه پاسخ خطا بررسی کنید و ببینید آیا کد پاسخ 4XX یا 5XX در Reason فهرست شده است یا خیر. برای مثال، faultstring زیر به‌وضوح نشان می‌دهد که کد پاسخ ۵۰۲ از سرور زیرینه برگردانده شده است:

    "faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"

وضوح

پس‌از تعیین کد پاسخ خطا، می‌توانید این مشکل را درست مانند هر خطای 4XX یا 5XX عیب‌یابی کنید. برای دستورالعمل‌های عیب‌یابی و رفع خطاهای 4XX یا 5XX، به کتابچه‌های خطای زمان اجرا (4XX/5XX) مراجعه کنید.