تحديد وحلّ المشاكل المتعلقة بخطأ وقت التشغيل في سياسة التحقّق من صحة رسائل 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"
    }
  }
}

السبب

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

    "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>
...