عیب‌یابی خطای زمان اجرای خط‌مشی «اعتبارسنجی پیام 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. در خط‌مشی ناموفق SOAPMessageValidation XML، تأیید کنید که نام متغیر تنظیم‌شده در عنصر <Source> با نام متغیر شناسایی‌شده در رشته خطا مطابقت داشته باشد (مرحله ۱ در بالا).

    برای مثال، خط‌مشی 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 از نوع «پیام» هستند. برای کسب اطلاعات بیشتر درباره متغیرهای پیام، به مرجع متغیرها مراجعه کنید.

تشخیص

  1. نام متغیری را که به نوع «پیام» از رشته خطا تبدیل نمی‌شود شناسایی کنید. برای مثال، در رشته خطای زیر، نام متغیر message.content است:

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. همه خط‌مشی‌های SOAPMessageValidation را در «پراکسی API» خاصی که خطا در آن رخ داده است بررسی کنید. ممکن است یک یا چند خط‌مشی SOAPMessageValidation وجود داشته باشد. خط‌مشی یا خط‌مشی‌های خاص SOAPMessageValidation را که در آن متغیر مشخص‌شده در عنصر <Source> با نام متغیر شناسایی‌شده در رشته خطا مطابقت دارد (مرحله ۱ در بالا) شناسایی کنید.

    برای مثال، خط‌مشی زیر عنصر <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 از نوع «پیام» نیست، این خطا را دریافت می‌کنید:

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

وضوح

مطمئن شوید عنصر <Source> در خط‌مشی ناموفق SOAPMessageValidation روی متغیر نوع Message تنظیم شده باشد که در جریانی که خط‌مشی در آن اجرا می‌شود وجود دارد.

برای اصلاح خط‌مشی، می‌توانید عنصر <Source> را تغییر دهید تا متغیری را که از نوع «پیام» است مشخص کنید. برای مثال، در خط‌مشی 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"
    }
  }
}

علت

این خطا زمانی رخ می‌دهد که خط‌مشی «اعتبارسنجی پیام SOAP» نتواند محتوای پیام ورودی را دربرابر طرحواره 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. بار ورودی را در شماره خط مشخص‌شده در «مرحله ۱» بالا بررسی کنید تا متوجه شوید چه چیزی باعث این خطا شده است.

    نمونه داده‌بر 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>
    

    در مثال نشان‌داده‌شده در بالا، خط ۹ دارای برچسب پایان </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>

راه‌حل شماره ۲

اگر فایل تعریف 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. بار ورودی را در شماره خط شناسایی‌شده در «مرحله ۱» بررسی کنید تا متوجه شوید چه چیزی باعث این خطا شده است.

    نمونه ورودی بار 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>
    

    در مثال نشان‌داده‌شده در بالا، خط ۱۱ عنصر فرزند <country> را در عنصر <shipTo> دارد.

  4. فایل «تعریف WSDL»، SOAP-Message-Validation-1.wsdl، استفاده‌شده در خط‌مشی «اعتبارسنجی پیام SOAP» را بررسی کنید تا ببینید عنصر فرزند <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]\""
    

وضوح

دو راه برای حل‌وفصل کردن این خطای اعتبارسنجی وجود دارد:

راه‌حل شماره ۱

اگر تشخیص دهید تعریف 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>

راه‌حل شماره ۲

اگر تعریف 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 بدشکل

این خطا زمانی رخ می‌دهد که بار داده ورودی 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. بار ورودی را در شماره خط مشخص‌شده در «مرحله ۱» بالا بررسی کنید تا متوجه شوید چه چیزی باعث این خطا شده است.

    نمونه ورودی بار 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>
    

    در مثال نشان‌داده‌شده در بالا، خط ۱۵ از XML ورودی عنصر <title> را دارد اما با برچسب پایانی </title> بسته نشده است.

وضوح

برای رفع این خطا، مطمئن شوید که پایه‌بار ورودی معتبر و به‌درستی شکل گرفته باشد.

برای مثال، می‌توانید پایه‌بار ورودی XML را به‌صورت زیر اصلاح کنید:

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