تحديد وحلّ المشاكل المتعلقة بخطأ وقت التشغيل في سياسة التحقّق من صحة رسائل SOAP

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

SourceMessageNotAvailable

رمز الخطأ

steps.messagevalidation.SourceMessageNotAvailable

نص الاستجابة للخطأ

{
  "fault": {
    "faultstring": "source_var_name message is not
     available for[policy_name]",
    "detail": {
      "Errorcode":
       "steps.messagevalidation.SourceMessageNotAvailable"
     }
  }
}

مثال على نص استجابة الخطأ

{
  "fault": {
    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1",
    "detail": {
      "errorcode": "steps.messagevalidation.SourceMessageNotAvailable"
    }
  }
}

السبب

يحدث هذا الخطأ إذا كان المتغيّر message المحدّد في عنصر <Source> من سياسة SOAPMessageValidation هو:

  • خارج النطاق (غير متوفّر في المسار المحدّد الذي يتم تنفيذ السياسة فيه)
  • لا يمكن حلها (غير محدّد)

على سبيل المثال، يحدث هذا الخطأ إذا تم ضبط عنصر <Source> في سياسة SOAPMessageValidation على متغيّر غير موجود في العملية التي يتم فيها تنفيذ السياسة.

التشخيص

  1. تحديد اسم سياسة SOAPMessageValidation حيث حدث الخطأ اسم المتغيّر source من سلسلة الخطأ. على سبيل المثال، في سلسلة الأخطاء التالية، اسم سياسة SOAPMessageValidation هو SOAP-Message-Validation-1 والمتغيّر source هو request:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    
  2. في ملف XML لسياسة SOAPMessageValidation التي تعذّر تنفيذها، تأكَّد من أنّ اسم المتغيّر الذي تم ضبطه في العنصر <Source> يتطابق مع اسم المتغيّر المحدّد في سلسلة الخطأ (الخطوة 1 أعلاه).

    على سبيل المثال، تحدّد سياسة SOAPMessageValidation التالية متغيّرًا باسم request في عنصر <Source>، والذي يتطابق مع ما هو مضمّن في سلسلة الخطأ:

    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
        <SOAPMessage/>
        <Source>request</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    
  3. حدِّد ما إذا كان المتغيّر المستخدَم في العنصر <Source> محدّدًا ومتاحًا في التدفق الذي يتم فيه تنفيذ السياسة SOAPMessageValidation.

    إذا كان المتغيّر:

    • خارج النطاق (لا تتوفّر خلال المسار المحدّد الذي يتم فيه تنفيذ السياسة)
    • لا يمكن حلّه (لم يتم تحديده)

    هذا هو سبب الخطأ.

    على سبيل المثال، لنفترض أنّ السياسة SOAPMessageValidation الموضحة أعلاه تم تنفيذها في مسار الاستجابة. مع ذلك، لا يتوفّر المتغيّر request المستخدَم في مثال العنصر <Source> أعلاه إلا في مسار request.

    سيظهر لك الخطأ التالي بسبب عدم توفّر المتغيّر request في مسار الاستجابة:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    

الدقة

يُرجى التأكّد من أنّ المتغيّر الذي تم ضبطه في العنصر <Source> في سياسة SOAPMessageValidation التي تعذّرت معالجتها محدّدًا وموجودًا في المسار الذي يتم فيه تنفيذ السياسة.

لتصحيح المثال المعروض أعلاه، يمكنك تعديل العنصر <Source> لاستخدام المتغيّر response المتوفّر في مسار الردّ:

<MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
    <DisplayName>SOAP Message Validation-1</DisplayName>
    <Properties/>
    <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
    <SOAPMessage/>
    <Source>response</Source>
    <ResourceURL>xsd://Script-1.xsd</ResourceURL>
</MessageValidation>

NonMessageVariable

رمز الخطأ

steps.messagevalidation.NonMessageVariable

نص الاستجابة للخطأ

{
  "fault": {
    "faultstring": "Variable var_name does not resolve to a Message"
    "detail": {
      "errorcode": "steps.messagevalidation.NonMessageVariable"
    }
  }
}

مثال على نص استجابة الخطأ

{
  "fault": {
    "faultstring": "Variable message.content does not resolve to a Message",
    "detail": {
      "errorcode": "steps.messagevalidation.NonMessageVariable"
    }
  }
}

السبب

يحدث هذا الخطأ إذا تم ضبط عنصر <Source> في سياسة SOAPMessageValidation على متغيّر ليس من النوع Message.

تمثّل متغيّرات أنواع الرسائل طلبات HTTP واستجاباتها بالكامل. المتغيّرات المضمّنة في عملية Apigee Edge، وهي request وresponse وmessage، من النوع Message. لمزيد من المعلومات عن متغيّرات الرسائل، اطّلِع على مرجع المتغيّرات.

التشخيص

  1. حدِّد اسم المتغيّر الذي لا يتم تحليله إلى نوع رسالة من سلسلة الخطأ. على سبيل المثال، في سلسلة الخطأ التالية، يكون اسم المتغيّر هو message.content:

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. راجِع جميع سياسات SOAPMessageValidation في وكيل واجهة برمجة التطبيقات المحدّد الذي حدث فيه الخطأ. قد تكون هناك سياسة واحدة أو أكثر من سياسات SOAPMessageValidation. حدِّد سياسة أو سياسات SOAPMessageValidation المحدّدة التي يتطابق فيها المتغيّر المحدّد في عنصر <Source> مع اسم المتغيّر المحدّد في سلسلة الخطأ (الخطوة 1 أعلاه).

    على سبيل المثال، تضبط السياسة التالية العنصر <Source> على متغيّر يسمى message.content، والذي يتطابق مع محتوى سلسلة الخطأ:

    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
        <SOAPMessage/>
        <Source>message.content</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    

    بما أنّ المتغيّر message.content ليس من النوع "Message" رسالة، ستظهر لك رسالة الخطأ:

    "faultstring": "Variable message.content does not resolve to a Message"
    

الدقة

تأكَّد من ضبط العنصر <Source> في سياسة SOAPMessageValidation التي تعذّر تنفيذها على متغيّر من النوع Message والذي يتوفّر في المسار الذي يتم تنفيذ السياسة فيه.

لتصحيح السياسة، يمكنك تعديل العنصر <Source> لتحديد متغيّر من النوع Message. على سبيل المثال، في سياسة SOAPMessageValidation التي تعذّر تنفيذها، يمكنك تحديد عنصر <Source> على أنّه request:

<MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
    <DisplayName>SOAP Message Validation-1</DisplayName>
    <Properties/>
    <Element namespace="http://sample.com"> sampleObject</Element>
    <SOAPMessage/>
    <Source>request</Source>
    <ResourceURL>xsd://Script-1.xsd</ResourceURL>
</MessageValidation>

تعذَّر التحميل

رمز الخطأ

steps.messagevalidation.Failed

نص الاستجابة للخطأ

{
  "fault": {
    "faultstring": "Variable var_name failed with reason: \"reason [Line varline_num
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

مثال على نص استجابة الخطأ

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

السبب

يحدث هذا الخطأ في حال تعذُّر التحقُّق من سياسة SOAPMessageValidation من صحة حمولة رسالة الإدخال بناءً على مخطط XSD أو تعريف WSDL. وسيحدث ذلك أيضًا في حال توفّر تنسيق غير صحيح لملف JSON أو XML في رسالة الحمولة.

في ما يلي بعض الأسباب المحتمَلة التي يمكن أن تؤدي إلى حدوث هذا الخطأ:

السبب الوصف
حمولة XML غير متطابقة لا تتوافق حمولة XML التي تم إدخالها مع مخطط XSD المحدّد في سياسة SoapMessageValidation.
عدم تطابق حمولة SOAP لا تلتزم حمولة SOAP بتعريف WSDL المحدد في سياسة SoapMessageValidation.
سلسلة JSON أو XML غير صحيحة لا تحتوي حمولة SOAP على ملف XML أو JSON مكتوب بشكل صحيح.

السبب: عدم تطابق الحمولة بتنسيق XML

يحدث هذا الخطأ إذا لم تكن الحمولة بتنسيق XML المُدخلة متوافقة مع مخطّط XSD المحدّد في عنصر <ResourceURL> ضمن سياسة SoapMessageValidation.

مثال على رسالة الخطأ

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

التشخيص

  1. حدِّد اسم السياسة SOAPMessageValidation وسبب الفشل ورقم السطر الذي لا تتطابق فيه حمولة XML مع مخطط XSD. وتوجد كل هذه المعلومات في سلسلة الخطأ. على سبيل المثال، في سلسلة الخطأ التالية، يكون اسم سياسة SOAPMessageValidation هو SOAP-Message-Validation-1,سبب الفشل هو Expecting a child element but found none [Line 9]: ورقم السطر هو 9.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    
  2. افحص سياسة SOAPMessageValidation وتأكد من أنها تستخدم ملف تعريف مخطط XSD للتحقق من صحة الرسائل. على سبيل المثال، تحتوي سياسة SOAPMessageValidation التالية على ملف مورد XSD في عنصر<ResourceURL>:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <SOAPMessage/>
        <Source>request</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    
  3. افحص حمولة البيانات المُدخلة على رقم السطر المحدّد في الخطوة 1 أعلاه لفهم سبب العطل.

    نموذج حمولة XML للإدخال

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
        <shipOrder
        xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
        <shipTo>
            <name>Karl Kalckstein</name>
        </shipTo>
        <items>
            <item>
                <title>I love APIs</title>
                <quantity>1</quantity>
                <price>2.90</price>
            </item>
        </items>
    </shipOrder>
    </soap:Body>
    </soap:Envelope>
    

    في المثال الوارد أعلاه، يحتوي السطر 9 على علامة النهاية </shipTo>.

  4. يمكنك فحص ملف تعريف مخطط XML، Script-1.xsd، المستخدَم في السياسة SOAPMessageValidation لمعرفة الشكل الذي يجب أن يظهر به العنصر <shipTo>:

    ...
    <xsd:element name="shipTo" type="shipAddress"/>
    ...
    <xsd:complexType name="shipAddress">
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="street" type="xsd:string"/>
    <xsd:element name="address" type="xsd:string"/>
    <xsd:element name="country" type="xsd:string"/>
    </xsd:sequence>
    </xsd:complexType>
    ...
    

    وفقًا لنموذج XSD المستخدَم في عملية التحقّق، يجب أن يكون العنصر <shipTo> تضم العناصر الفرعية <name> و<street> و<address> و<country>. ومع ذلك، تحتوي حمولة XML التي تم إدخالها على عنصر ثانوي واحد فقط، وهو <name>. نتيجةً لذلك، تظهر لك رسالة الخطأ التالية:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    

الدقة

هناك طريقتان لحلّ خطأ التحقّق من الصحة هذا:

الحل رقم 1

إذا تبيّن لك أنّ تعريف مخطّط XSD يفرض قيودًا غير ضرورية وأنّ العنصر الفرعي <name> فقط مطلوب ضمن العنصر <shipTo>، يمكنك تعديل Script-1.xsd المستخدَم في سياسة SOAPMessageValidation. للتحقّق من صحة مثال الحمولة أعلاه، يمكنك تعديل ملف XSD على النحو التالي:

...
<xsd:element name="shipTo" type="shipAddress"/>
...
<xsd:complexType name="shipAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>

الحلّ 2

إذا كان ملف تعريف XSD صحيحًا، يمكن تغيير حمولة XML المُدخَلة لتطابق xsd. على سبيل المثال، يمكنك تعديل الحمولة للامتثال لـ xsd على النحو التالي:

<?xml version="1.0">
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
    <shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
    <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
    </shipTo>
    <items>
        <item>
            <title>I love APIs</title>
            <quantity>1</quantity>
            <price>2.90</price>
        </item>
    </items>
</shipOrder>
</soap:Body>
</soap:Envelope>

السبب: عدم تطابق حمولة SOAP

يحدث هذا الخطأ إذا لم تتوافق حمولة SOAP مع تعريف WSDL المحدّد في العنصر <ResourceURL> في سياسة SoapMessageValidation.

مثال على رسالة الخطأ

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

التشخيص

  1. حدِّد اسم سياسة SOAPMessageValidation وسبب الفشل ورقم السطر الذي لا تتطابق فيه حمولة SOAP مع تعريف WSDL. يمكنك العثور على كل هذه المعلومات من سلسلة الخطأ. على سبيل المثال، في سلسلة الأخطاء التالية، اسم سياسة SOAPMessageValidation هو SOAP-Message-Validation-1، وسبب الخطأ هو \"Element name mismatch. Wildcard? [Line 11]\"" ورقم السطر هو 11:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    
  2. راجِع السياسة SOAPMessageValidation وتأكَّد من أنها تستخدم مخطط wsdl للتحقق من صحة الرسائل. على سبيل المثال، تحتوي سياسة SOAPMessageValidation التالية على ملف موارد wsdl في العنصر<ResourceURL>:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <SOAPMessage/>
        <Source>request</Source>
     <ResourceURL>wsdl://SOAP-Message-Validation-1.wsdl</ResourceURL>
    </MessageValidation>
    
  3. افحص حمولة الإدخال على رقم الخط المحدّد في الخطوة 1 لفهم سبب العطل.

    نموذج حمولة SOAP للإدخال

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
    <shipOrder
    xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
      <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
      </shipTo>
      <items>
        <item>
          <title>I love APIs</title>
          <quantity>1</quantity>
          <price>2.90</price>
        </item>
      </items>
    

    في المثال المعروض أعلاه، يحتوي السطر 11 على العنصر الفرعي <country> ضمن العنصر <shipTo>.

  4. راجِع ملف تعريف WSDL، SOAP-Message-Validation-1.wsdl، المستخدَم في سياسة SOAPMessageValidation لمعرفة المشكلة المحتملة في العنصر الفرعي <country> ضمن العنصر <shipTo>:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
        <wsdl:types>
          <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="shipOrder" type="order"/>
    <xsd:complexType name="order">
    <xsd:sequence>
    <xsd:element name="shipTo" type="shipAddress"/>
    <xsd:element name="items" type="cdItems"/>
    </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="shipAddress">
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="street" type="xsd:string"/>
    <xsd:element name="address" type="xsd:string"/>
    </xsd:sequence>
    ...
    

    وفقًا لتعريف WSDL المستخدَم للتحقق، لا يحتوي العنصر <shipTo>على عنصر <country> ثانوي. نتيجةً لذلك، تظهر لك رسالة الخطأ التالية:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    

الدقة

هناك طريقتان لحلّ خطأ التحقّق من الصحة هذا:

الحل رقم 1

إذا تبيّن لك أنّ تعريف WSDL المستخدَم غير صحيح، يمكنك تغيير SOAP-Message-Validation-1.wsdl المستخدَم في سياسة SOAPMessageValidation. للتحقّق من صحة مثال الحمولة أعلاه، يمكنك تعديل الملف على النحو التالي:

...
<xsd:complexType name="shipAddress">`
...
<sequence>
    <element name="name" type="xsd:string"/>
    <element name="street" type="xsd:string"/>
    <element name="address" type="xsd:string"/>
    <element name="country" type="xsd:string"/>
</sequence>

الحل رقم 2

إذا كان تعريف WSDL صحيحًا، يمكن تغيير حمولة SOAP للإدخال لتطابق تعريف WSDL.

على سبيل المثال، يمكنك تعديل حمولة SOAP على النحو التالي:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
    <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
    </shipTo>
    <items>
        <item>
            <title>I love APIs</title>
            <quantity>1</quantity>
            <price>2.90</price>
        </item>
    </items>

السبب: تنسيق JSON أو XML غير صحيح

يحدث هذا الخطأ إذا لم تتوافق حمولة SOAP مع تعريف WSDL المحدّد في العنصر <ResourceURL> في سياسة SoapMessageValidation.

مثال على رسالة الخطأ

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected <\/title> at line 15(possibly  around char 420)\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

التشخيص

  1. حدِّد اسم سياسة SOAPMessageValidation وسبب الفشل ورقم سطر حمولة XML التي لا يتطابق مع تعريف WSDL. يمكنك العثور على كل هذه المعلومات في سلسلة الخطأ. على سبيل المثال، في سلسلة الخطأ التالية، اسم سياسة SOAPMessageValidation هو SOAP-Message-Validation-1، وسبب الفشل هو Expected </title> at line 15(possibly around char 420): ورقم السطر هو 15.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly  around char 420)\""
    
  2. افحص حمولة البيانات المُدخلة على رقم السطر المحدّد في الخطوة 1 أعلاه لفهم سبب العطل.

    نموذج حمولة SOAP للإدخال

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
    <shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
      <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
      </shipTo>
      <items>
        <item>
          <title>I love APIs</titles>
          <quantity>1</quantity>
          <price>2.90</price>
        </item>
      </items>
    </shipOrder>
    </soap:Body>
    </soap:Envelope>
    

    في المثال الوارد أعلاه، يتضمّن السطر 15 من ملف XML الخاص بالإدخال العنصر <title>، لكنّه لم يتم إغلاقه بعلامة النهاية </title>.

الدقة

لإصلاح الخطأ، تأكَّد من أنّ حمولة البيانات المُدخلة صالحة ومن أنّه تم تكوينها بشكل صحيح.

على سبيل المثال، يمكنك تعديل حمولة XML المدخلة على النحو التالي:

...
</shipTo>
<items>
  <item>
    <title>I love APIs</title>
    <quantity>1</quantity>
    <price>2.90</price>
  </item>
</items>
...