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 y Apigee Hybrid.
Consulta la documentación de Apigee Edge.

SourceMessageNotAvailable

Código de error

steps.messagevalidation.SourceMessageNotAvailable

Cuerpo de respuesta de error

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

Cuerpo de 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 message especificada en el elemento <Source> de la política SOAPMessageValidation es:

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

Por ejemplo, este error se produce si el elemento <Source> de la política SOAPMessageValidation se asigna a 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 donde se produce el error y el nombre de la variable source de la cadena de error. Por ejemplo, en la siguiente cadena de 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 XML de la política SOAPMessageValidation fallida, comprueba que el nombre de la variable definida en el elemento <Source> coincida con el nombre de la variable identificada en la cadena de error (paso 1 anterior).

    Por ejemplo, la siguiente política SOAPMessageValidation especifica una variable llamada request en el elemento <Source>, que coincide con lo que hay en la cadena 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>request</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    
  3. Determina si la variable utilizada en el elemento <Source> está definida y disponible en el flujo en el que se ejecuta la política SOAPMessageValidation.

    Si la variable es:

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

    entonces, esa es la causa del error.

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

    Como la variable request no existe en el flujo de respuesta, se produce el siguiente error:

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

Resolución

Comprueba que la variable definida en el elemento <Source> de la política SOAPMessageValidation fallida se haya definido y exista en el flujo en el que se ejecuta la política.

Para corregir el ejemplo que se muestra arriba, 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 respuesta de error

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

Cuerpo de respuesta de error de ejemplo

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

Causa

Este error se produce si el elemento <Source> de la política SOAPMessageValidation se asigna a una variable que no es del tipo Message.

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

Diagnóstico

  1. Identifica el nombre de la variable que no se resuelve en un tipo Message a partir de la cadena de error. Por ejemplo, en la siguiente cadena de 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 SOAPMessageValidation del proxy de API específico en el que se ha producido el error. Puede haber una o varias políticas SOAPMessageValidation. Identifique la política o las políticas de SOAPMessageValidation específicas en las que la variable especificada en el elemento <Source> coincida con el nombre de la variable identificada en la cadena de error (paso 1 anterior).

    Por ejemplo, la siguiente política asigna al elemento <Source> una variable llamada message.content, que coincide con lo que hay en la cadena 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>
    

    Como la variable message.content no es del tipo Message, se produce 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 SOAPMessageValidation fallida se haya definido en una variable de tipo Message que exista en el flujo en el que se ejecuta la política.

Para corregir la política, puede modificar el elemento <Source> para especificar una variable de tipo Message. Por ejemplo, en la política SOAPMessageValidation fallida, 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>

Error

Código de error

steps.messagevalidation.Failed

Cuerpo de respuesta de error

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

Cuerpo de 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 puede validar la carga útil del mensaje de entrada con el esquema XSD o la definición WSDL. También se producirá si el mensaje de carga útil contiene JSON o XML con errores de formato.

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

Causa Descripción
Carga útil XML no coincidente La carga útil XML de entrada no se ajusta al esquema XSD especificado en la política SoapMessageValidation.
Carga útil de SOAP no coincidente La carga útil SOAP de entrada no se ajusta a la definición de WSDL especificada en la política SoapMessageValidation.
JSON o XML mal formado La carga útil de SOAP de entrada no contiene XML o JSON con el formato correcto.

Causa: la carga útil XML no coincide

Este error se produce si la carga útil XML de entrada no cumple 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 se encuentra en la cadena de errores. Por ejemplo, en la siguiente cadena 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 en el número de línea identificado en el paso 1 anterior para saber qué ha provocado el fallo.

    Carga útil XML de entrada de ejemplo

    <?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 cierre </shipTo>.

  4. Examina el archivo de definición del 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 ejemplo utilizado para la validación, el elemento <shipTo> debe tener los elementos secundarios <name>, <street>, <address> y <country>. Sin embargo, la carga útil XML de entrada solo tiene un elemento secundario, <name>. Como resultado, aparece el siguiente error:

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

Resolución

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

Solución 1

Si determina que la definición del esquema XSD impone limitaciones innecesarias y que solo se requiere el elemento secundario <name> en el elemento <shipTo>, puede modificar el Script-1.xsd utilizado en la política SOAPMessageValidation. Para validar el ejemplo de carga útil anterior, puede 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 n.º 2

Si el archivo de definición XSD es correcto, la carga útil XML de entrada se puede cambiar para que coincida con xsd. Por ejemplo, puedes modificar la carga útil para que cumpla el xsd de la siguiente manera:

<?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: la carga útil de SOAP no coincide

Este error se produce si la carga útil SOAP de entrada no se ajusta a la definición de WSDL especificada en el elemento <ResourceURL> de la política 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 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 de WSDL. Puedes encontrar toda esta información en la cadena de errores. Por ejemplo, en la siguiente cadena de error, el nombre de la política SOAPMessageValidation es SOAP-Message-Validation-1, el motivo del error 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 los 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 en el número de línea identificado en el paso 1 para saber qué ha provocado el fallo.

    Carga útil SOAP de entrada de ejemplo

    <?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> en el elemento <shipTo>.

  4. Examina el archivo de definición de WSDL, SOAP-Message-Validation-1.wsdl, que se usa en la política SOAPMessageValidation para ver qué puede fallar en el elemento secundario <country> del 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 de WSDL utilizada para la validación, el elemento <shipTo> no tiene un elemento secundario <country>. Como resultado, aparece el siguiente error:

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

Resolución

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

Solución 1

Si determina que la definición de WSDL utilizada es incorrecta, puede cambiar el SOAP-Message-Validation-1.wsdl utilizado 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 n.º 2

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

Por ejemplo, puedes modificar la carga útil 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 mal formado

Este error se produce si la carga útil SOAP de entrada no se ajusta a la definición de WSDL especificada en el elemento <ResourceURL> de la política 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 SOAPMessageValidation, el motivo del error y el número de línea de la carga útil XML que no coincide con la definición de WSDL. Puedes encontrar toda esta información en la cadena de errores. Por ejemplo, en la siguiente cadena de error, el nombre de la política SOAPMessageValidation es SOAP-Message-Validation-1, el motivo del error 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 en el número de línea identificado en el paso 1 anterior para saber qué ha provocado el fallo.

    Carga útil SOAP de entrada de ejemplo

    <?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 la etiqueta final </title>.

Resolución

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

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

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