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

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

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، فهي من النوع "الرسائل". لمعرفة المزيد من المعلومات عن متغيّرات الرسائل، اطّلِع على مرجع المتغيّرات.

التشخيص

  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]\""
    

الدقة

هناك طريقتان لحل خطأ التحقق هذا:

الحلّ الأول

إذا تبيّن لك أنّ تعريف مخطّط 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>
...