عیب یابی خطای زمان اجرا خط مشی اعتبارسنجی پیام 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"
    }
  }
}

علت

این خطا در صورتی رخ می دهد که متغیر پیام مشخص شده در عنصر <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 را در پروکسی API خاصی که در آن خرابی رخ داده است، بررسی کنید. ممکن است یک یا چند خط‌مشی 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 روی یک متغیر نوع پیام تنظیم شده است که در جریانی که خط مشی اجرا می شود وجود دارد.

برای تصحیح این خط مشی، می توانید عنصر <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 payload

    <?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 Payload

    <?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 Payload

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