عیب یابی خطای زمان اجرا خط مشی اعتبارسنجی پیام SOAP

شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید .
اطلاعات

منبعپیام در دسترس نیست

کد خطا

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 در جریان پاسخ وجود ندارد، خطای زیر را دریافت می‌کنید:

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

متغیر غیرپیام

کد خطا

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 تبدیل نمی‌شود، از رشته‌ی خطا شناسایی کنید. برای مثال، در رشته‌ی خطای زیر، نام متغیر message.content است:

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. تمام سیاست‌های SOAPMessageValidation را در API Proxy خاصی که خرابی در آن رخ داده است، بررسی کنید. ممکن است یک یا چند سیاست 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. برای فهمیدن علت خرابی، بار داده ورودی روی شماره خط مشخص شده در مرحله ۱ بالا را بررسی کنید.

    نمونه ورودی 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]\""
    

وضوح تصویر

دو راه برای رفع این خطای اعتبارسنجی وجود دارد:

راه حل شماره ۱

اگر تشخیص دهید که تعریف طرحواره XSD محدودیت‌های غیرضروری اعمال می‌کند و فقط عنصر فرزند <name> زیر عنصر <shipTo> مورد نیاز است، می‌توانید Script-1.xsd مورد استفاده در سیاست SOAPMessageValidation را تغییر دهید. برای اعتبارسنجی مثال payload بالا، می‌توانید فایل 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 صحیح باشد، می‌توان payload ورودی XML را برای مطابقت با xsd تغییر داد. برای مثال، می‌توانید payload را برای مطابقت با 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 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]\""
    

وضوح تصویر

دو راه برای رفع این خطای اعتبارسنجی وجود دارد:

راه حل شماره ۱

اگر تشخیص دهید که تعریف WSDL استفاده شده نادرست است، می‌توانید SOAP-Message-Validation-1.wsdl استفاده شده در سیاست SOAPMessageValidation را تغییر دهید. برای اعتبارسنجی مثال payload بالا، می‌توانید فایل را به صورت زیر تغییر دهید:

...
<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 یا 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 payload که با تعریف 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 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>
    

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

وضوح تصویر

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

برای مثال، می‌توانید فایل XML ورودی را به صورت زیر تغییر دهید:

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