Solución de problemas de errores del entorno de ejecución de la política de validación de mensajes SOAP

Estás consultando la documentación de Apigee Edge.
Consulta la documentación de Apigee X.
Información

SourceMessageNotAvailable

Código de error

steps.messagevalidation.SourceMessageNotAvailable

Cuerpo de la respuesta de error

{
  "fault": {
    "faultstring": "source_var_name message is not
     available for[policy_name]",
    "detail": {
      "Errorcode":
       "steps.messagevalidation.SourceMessageNotAvailable"
     }
  }
}

Cuerpo de la respuesta de error de ejemplo

{
  "fault": {
    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1",
    "detail": {
      "errorcode": "steps.messagevalidation.SourceMessageNotAvailable"
    }
  }
}

Causa

Este error se produce si la variable mensaje especificada en el elemento <Source> de la política SOAPMessageValidation es una de las siguientes opciones:

  • Fuera del alcance (no disponible en el flujo específico en el que se ejecuta la política)
  • no se puede resolver (no está definido)

Por ejemplo, este error ocurre si el elemento <Source> de la política SOAPMessageValidation se configura como una variable que no existe en el flujo en el que se ejecuta la política.

Diagnóstico

  1. Identifica el nombre de la política SOAPMessageValidation en la que produjo el error y el nombre de la variable source de la string con error. Por ejemplo, en la siguiente string con error, el nombre de la política SOAPMessageValidation es SOAP-Message-Validation-1 y la variable source es request:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    
  2. En el archivo XML de la política SOAPMessageValidation, verifica que el nombre de la variable establecida en el elemento <Source> coincida con el nombre de la variable identificado en la string de error (paso 1 anterior).

    Por ejemplo, la siguiente política SOAPMessageValidation especifica una variable llamada request en el elemento <Source>, que coincide con la string con error:

    <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. Determina si la variable que se usa en el elemento <Source> está definida y disponible en el flujo en el que se ejecuta la política SOAPMessageValidation.

    Verifica si la variable tiene una de las siguientes características:

    • fuera de alcance (no disponible en el flujo específico en el que se ejecuta la política) o
    • no se pueden resolver (no está definido)

    entonces esa es la causa del error.

    A modo de ejemplo, supongamos que la política SOAPMessageValidation anterior se ejecuta en el flujo de respuesta. Sin embargo, la variable request que se usa en el ejemplo de elemento <Source> anterior solo está disponible en el flujo de la solicitud.

    Debido a que la variable request no existe en el flujo de respuesta, recibes el siguiente error:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    

Resolución

Asegúrate de que la variable establecida en el elemento <Source> de la política SOAPMessageValidation con errores se defina y exista en el flujo en el que se ejecuta la política.

Si quieres corregir el ejemplo anterior, puedes modificar el elemento <Source> para usar la variable response, que existe en el flujo de respuesta:

<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

Código de error

steps.messagevalidation.NonMessageVariable

Cuerpo de la respuesta de error

{
  "fault": {
    "faultstring": "Variable var_name does not resolve to a Message"
    "detail": {
      "errorcode": "steps.messagevalidation.NonMessageVariable"
    }
  }
}

Cuerpo de la respuesta de error de ejemplo

{
  "fault": {
    "faultstring": "Variable message.content does not resolve to a Message",
    "detail": {
      "errorcode": "steps.messagevalidation.NonMessageVariable"
    }
  }
}

Causa

Este error ocurre si el elemento <Source> en la política SOAPMessageValidation está configurado en una variable que no es del tipo mensaje.

Las variables del tipo de mensaje representan respuestas y solicitudes HTTP completas. Las variables de flujo integradas de Apigee Edge request, response y message son del tipo Message. Para obtener más información acerca de las variables de mensaje, consulta la Referencia de lasvariables.

Diagnóstico

  1. Identifica el nombre de la variable que no se resuelve en un tipo de mensaje de la string con error. Por ejemplo, en la siguiente string con error, el nombre de la variable es message.content:

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. Examina todas las políticas de cuotas en el proxy de API específico en el que se produjo el error. Podría haber una o más políticas SOAPMessageValidation. Identifica la política o las políticas SOAPMessageValidation específicas en las que la variable especificada en el elemento <Source> coincide con el nombre de variable identificado en la string con error (paso 1 anterior).

    Por ejemplo, con la siguiente política, se establece el elemento <Source> en una variable llamada message.content, que coincide con lo que hay en la string con de error:

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

    Debido a que la variable message.content no es del tipo Message, verá el siguiente error:

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

Resolución

Asegúrate de que el elemento <Source> de la política de SOAPMessageValidation con error esté configurado como una variable de tipo mensaje que existe en el flujo en el que se ejecuta la política.

A fin de corregir la política, puedes modificar el elemento <Source> para especificar una variable que sea de tipo de mensaje. Por ejemplo, en la política de SOAPMessageValidation con error, puedes especificar el elemento <Source> como 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>

Con errores

Código de error

steps.messagevalidation.Failed

Cuerpo de la respuesta de error

{
  "fault": {
    "faultstring": "Variable var_name failed with reason: \"reason [Line varline_num
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Cuerpo de la respuesta de error de ejemplo

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Causa

Este error se produce si la política SOAPMessageValidation no valida la carga útil del mensaje de entrada en función del esquema XSD o la definición WSDL. También ocurrirá si hay JSON o XML de formato incorrecto en el mensaje de carga útil.

Estas son algunas de las posibles causas que pueden generar este error:

Causa Descripción
Carga útil de XML que no coincide La carga útil XML de entrada no cumple con el esquema XSD especificado en la política SoapMessageValidation.
Carga útil de SOAP que no coincide La carga útil SOAP de entrada no cumple con la definición WSDL especificada en la política de SoapMessageValidation.
JSON o XML con formato incorrecto La carga útil SOAP de entrada no contiene XML o JSON con el formato correcto.

Causa: la carga útil de XML no coincide

Este error se genera si la carga útil de XML de entrada no cumple con el esquema XSD especificado en el elemento <ResourceURL> de la política SoapMessageValidation.

Ejemplo de mensaje de error

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnóstico

  1. Identifica el nombre de la política SOAPMessageValidation, el motivo del error y el número de línea en el que la carga útil XML no coincide con el esquema XSD. Toda esta información está en la string con error. Por ejemplo, en la siguiente string de error, el nombre de la política SOAPMessageValidation es SOAP-Message-Validation-1,, el motivo del error es Expecting a child element but found none [Line 9] y el número de línea es 9.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    
  2. Examina la política SOAPMessageValidation y confirma que usa un archivo de definición de esquema XSD para validar los mensajes. Por ejemplo, la siguiente política SOAPMessageValidation tiene un archivo de recursos XSD en el elemento <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. Examina la carga útil de entrada del número de línea identificado en el paso 1 para comprender la causa de la falla.

    Carga útil de XML de entrada de muestra

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

    En el ejemplo anterior, la línea 9 tiene la etiqueta de finalización </shipTo>.

  4. Examina el archivo de definición de esquema XML, Script-1.xsd, que se usa en la política SOAPMessageValidation para ver cómo debe ser el elemento <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>
    ...
    

    Según el XSD de muestra que se usa para la validación, el elemento <shipTo> debe tener los elementos secundarios <name>, <street>, <address> y <country>. Sin embargo, la carga útil de XML de entrada solo tiene un elemento secundario, <name>. Como resultado, verás el siguiente error:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    

Resolución

Hay dos maneras de resolver este error de validación:

Solución 1

Si determinas que la definición del esquema XSD impone limitaciones innecesarias y solo el elemento secundario <name> es obligatorio en el elemento <shipTo>, puedes modificar el objeto Script-1.xsd que se usa en la política SOAPMessageValidation. Para validar el ejemplo de carga útil anterior, puedes modificar el archivo XSD de la siguiente manera:

...
<xsd:element name="shipTo" type="shipAddress"/>
...
<xsd:complexType name="shipAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>

Solución

Si el archivo de definición XSD es correcto, la carga útil de XML de entrada se puede cambiar para que coincida con xsd. Por ejemplo, puedes modificar la carga útil para que cumpla con 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>

Causa: error de la carga útil de SOAP

Este error ocurre si la carga útil del SOAP de entrada no cumple con la definición WSDL especificada en el elemento <ResourceURL> de la política de SoapMessageValidation.

Ejemplo de mensaje de error

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnóstico

  1. Identifica el nombre de la política de SOAPMessageValidation, el motivo del error y el número de línea en el que la carga útil de SOAP no coincide con la definición WSDL. Puedes encontrar toda esta información en la string de errores. Por ejemplo, en la siguiente string con error, el nombre de la política SOAPMessageValidation es SOAP-Message-Validation-1, el motivo de la falla es \"Element name mismatch. Wildcard? [Line 11]\"" y el número de línea es 11:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    
  2. Examina la política SOAPMessageValidation y confirma que usa un esquema wsdl para validar mensajes. Por ejemplo, la siguiente política SOAPMessageValidation tiene un archivo de recursos wsdl en el elemento <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. Examina la carga útil de entrada del número de línea identificado en el paso 1 para comprender la causa de la falla.

    Carga útil de SOAP de muestra

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

    En el ejemplo anterior, la línea 11 tiene el elemento secundario <country> debajo del elemento <shipTo>.

  4. Examina el archivo de definición WSDL, SOAP-Message-Validation-1.wsdl, que se usa en la política SOAPMessageValidation para ver qué podría ser incorrecto con el elemento secundario <country> en el elemento <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>
    ...
    

    Según la definición WSDL que se usa para la validación, el elemento <shipTo> no tiene un elemento secundario <country>. Como resultado, verás el siguiente error:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    

Resolución

Hay dos maneras de resolver este error de validación:

Solución 1

Si determinas que la definición WSDL es incorrecta, puedes cambiar el SOAP-Message-Validation-1.wsdl que se usa en la política SOAPMessageValidation. Para validar el ejemplo de carga útil anterior, puedes modificar el archivo de la siguiente manera:

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

Solución

Si la definición de WSDL es correcta, la carga útil de SOAP de entrada puede cambiarse para que coincida con la definición WSDL.

Por ejemplo, puedes modificar la carga útil de SOAP de entrada de la siguiente manera:

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

Causa: JSON o XML con formato incorrecto

Este error ocurre si la carga útil del SOAP de entrada no cumple con la definición WSDL especificada en el elemento <ResourceURL> de la política de SoapMessageValidation.

Ejemplo de mensaje de error

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected <\/title> at line 15(possibly  around char 420)\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnóstico

  1. Identifica el nombre de la política de SOAPMessageValidation, el motivo del error y el número de línea de la carga útil de XML que no coincide con la definición WSDL. Puedes encontrar toda esta información en la string con error. Por ejemplo, en la siguiente string con error, el nombre de la política SOAPMessageValidation es SOAP-Message-Validation-1, el motivo de la falla es Expected </title> at line 15(possibly around char 420): y el número de línea es 15..

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly  around char 420)\""
    
  2. Examina la carga útil de entrada del número de línea identificado en el paso 1 para comprender la causa de la falla.

    Carga útil de SOAP de muestra

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

    En el ejemplo anterior, la línea 15 del XML de entrada tiene el elemento <title>, pero no se cierra con una etiqueta de cierre </title>.

Solución

Para solucionar el error, asegúrate de que la carga útil de entrada sea válida y el formato sea correcto.

Por ejemplo, puedes modificar la carga útil de XML de entrada de la siguiente manera:

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