تحديد وحلّ المشاكل المتعلقة بأخطاء وقت تشغيل وسيلة شرح الخدمة

أنت تطّلع على مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
info

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> في سياسة وسيلة شرح الخدمة من النوع message. إذا كان المتغيّر سلسلة أو أي نوع آخر غير رسالة، ستظهر لك رسالة الخطأ هذه.

تمثِّل متغيّرات نوع الرسالة طلبات واستجابات 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> يتطابق مع اسم المتغيّر المحدّد في سلسلة الخطأ (الخطوة رقم 1 أعلاه). على سبيل المثال، تحدّد السياسة التالية متغيّر طلب باسم 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. حدِّد ما إذا كان هذا المتغيّر من النوع message أم لا:

    1. حدِّد موقع الرمز داخل حزمة الخادم الوكيل لواجهة برمجة التطبيقات، حيث تم تحديد المتغيّر أولاً.
    2. في معظم الحالات، ستلاحظ أنّ متغيّر المشكلة يتم إنشاؤه وتعبئته في سياسة أخرى يتم تنفيذها قبل سياسة عرض معلومات الخدمة. على سبيل المثال، يتم عادةً استخدام سياسة "تعيين رسالة" لإنشاء المتغيّرات وتعبئتها في مسار الخادم الوكيل لواجهة برمجة التطبيقات.
    3. بعد معرفة السياسة التي تم فيها تعريف المتغيّر وملؤه أولاً، عليك تحديد نوع هذا المتغيّر على النحو التالي:
      • تحقّق من قيمة سمة type (في حال توفّرها).
      • إذا لم تتوفّر السمة type، يُعتبر المتغيّر سلسلة.
    4. إذا كان نوع المتغير ليس رسالة (مثل سلسلة)، يكون هذا هو سبب الخطأ. يمكنك التعرّف على المتغيّرات الشائعة وأنواعها في مرجع المتغيّرات.

على سبيل المثال، لنفترض أنّه تم إنشاء المتغيّر PostalCode المُشار إليه في سياسة Service Callout في سياسة Assign Message التالية. تجدر الإشارة إلى أنّه تمّ تعيين قيمة متغيّر التدفق 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> لتحديد متغيّر حالي أو جديد من النوع message. على سبيل المثال، المتغيّر 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، من النوع message. لمعرفة المزيد من المعلومات عن متغيّرات الرسائل، اطّلِع على مرجع المتغيّرات.

التشخيص

  1. حدِّد سياسة عرض الخدمة التي حدث فيها الخطأ واسم المتغيّر الذي يكون نوعه غير صحيح. يمكنك العثور على كلا العنصرين في العنصر faultstring في استجابة الخطأ. على سبيل المثال، في سياسة faultstring التالية، يكون اسم السياسة هو ExecuteGeocodingRequest والمتغيّر هو var_response:

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

  2. في ملف XML الخاص بسياسة "تسمية الخدمة" التي تعذّر تنفيذها، تأكَّد من أنّ اسم المتغيّر الذي تم ضبطه في عنصر <Request> يتطابق مع اسم المتغيّر المحدّد في سلسلة الخطأ (الخطوة 1 أعلاه). على سبيل المثال، تحدّد السياسة التالية متغيّر طلب باسم 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. حدِّد موقع الرمز داخل حزمة الخادم الوكيل لواجهة برمجة التطبيقات، حيث تم تحديد المتغيّر أولاً.
    2. في معظم الحالات، ستلاحظ أنّ متغيّر المشكلة يتم إنشاؤه وتعبئته في سياسة أخرى يتم تنفيذها قبل سياسة عرض معلومات الخدمة. على سبيل المثال، يتم عادةً استخدام سياسة "تعيين رسالة" لإنشاء المتغيّرات وتعبئتها في مسار الخادم الوكيل لواجهة برمجة التطبيقات.
    3. بعد معرفة السياسة التي تم فيها تعريف المتغيّر وملؤه أولاً، عليك تحديد نوع هذا المتغيّر على النحو التالي:
      • تحقّق من قيمة سمة type (في حال توفّرها).
      • إذا لم تتوفّر السمة type، يُعتبر المتغيّر سلسلة.
    4. إذا لم يكن نوع المتغيّر من النوع request message، يكون هذا هو سبب الخطأ. يمكنك التعرّف على المتغيّرات الشائعة وأنواعها في مرجع المتغيّرات.

على سبيل المثال، لنفترض أنّ المتغيّر var_response المُشار إليه في سياسة "وسائل شرح الخدمة" قد تم إنشاؤه في سياسة "تعيين الرسائل" التالية. يُرجى العِلم أنّ النوع var_response ينتمي إلى النوع 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"
        }
    }
}

الأسباب المحتملة

الأسباب المحتملة لهذا الخطأ هي:

السبب الوصف
عنوان URL غير صالح أو مكتوب بشكلٍ غير صحيح عنوان URL المستهدف في سياسة وسيلة شرح الخدمة مكتوب بشكل غير صحيح أو يحتوي على اسم مضيف غير صالح أو لا يمكن الوصول إليه.
خطأ في خادم الخلفية يعرض خادم الخلفية استجابة الخطأ 4XX أو 5XX.

السبب: عنوان URL غير صالح أو مكتوب بشكلٍ غير صحيح

عنوان URL المستهدَف في سياسة عرض معلومات الخدمة غير صحيح أو يحتوي على اسم مضيف غير صالح أو لا يمكن الوصول إليه.

التشخيص

  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 صالح مع اسم مضيف يمكن الوصول إليه.

لتصحيح سياسة "وسائل شرح الخدمة" الموضّحة أعلاه، يمكنك تعديل العنصر <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. على سبيل المثال، تشير سلسلة الخطأ التالية بوضوح إلى أنّه تم إرجاع رمز الاستجابة 502 من خادم الخلفية:

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

الدقة

بعد تحديد رمز استجابة الخطأ، يمكنك تحديد هذه المشكلة وحلّها كما تفعل مع أيّ خطأ من نوع 4XX أو 5XX. يُرجى الاطّلاع على الأدلّة الإرشادية لخطأ وقت التشغيل (4XX/5XX) للحصول على تعليمات حول تحديد المشاكل وحلّها وحلّ أخطاء 4XX أو 5XX.