Устранение ошибок во время выполнения политики проверки сообщений 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> политики неудачной проверки SOAP-сообщений, определена и существует в потоке, где выполняется эта политика.

Чтобы исправить приведенный выше пример, вы можете изменить элемент <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 .

Переменные типа Message представляют собой полные HTTP-запросы и ответы. Встроенные переменные потока Apigee Edge request , response и message имеют тип Message. Для получения дополнительной информации о переменных типа Message см. справочник по переменным .

Диагноз

  1. Определите в строке ошибки имя переменной, которая не соответствует типу Message. Например, в следующей строке ошибки имя переменной — 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, вызвавшей ошибку, имеет значение переменной типа 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 накладывает ненужные ограничения и в элементе <shipTo> требуется только дочерний элемент <name> , вы можете изменить файл 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>
...