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

원인

이 오류는 SOAPMessageValidation 정책의 <Source> 요소에 지정된 message 변수가 다음 중 하나일 때 발생합니다.

  • 범위를 벗어난 경우(정책이 실행 중인 특정 흐름에서 사용할 수 없음)
  • 확인할 수 없는 경우(정의되지 않음)

예를 들어 SOAPMessageValidation 정책의 <Source> 요소가 정책이 실행되는 흐름에 존재하지 않는 변수로 설정된 경우 이 오류가 발생합니다.

진단

  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> 요소에 설정된 변수 이름이 오류 문자열(위의 1단계)에서 식별되는 변수 이름과 일치하는지 확인합니다.

    예를 들어 다음 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://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
        <SOAPMessage/>
        <Source>request</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    
  3. <Source> 요소에 사용된 변수가 정의되었고 SOAPMessageValidation 정책이 실행되는 흐름에서 사용할 수 있는지 확인합니다.

    변수가 다음 중 하나인 경우

    • 범위를 벗어난 경우(정책이 실행 중인 특정 흐름에서 사용할 수 없음)
    • 확인할 수 없는 경우(정의되지 않음)

    이는 오류의 원인이 됩니다.

    예를 들어 위에 있는 SOAPMessageValidation 정책이 응답 흐름에서 실행된다고 가정해 봅시다. 하지만 위의 <Source> 요소 예시에서 사용한 request 변수는 요청 흐름에서만 사용할 수 있습니다.

    응답 흐름에 request 변수가 없으므로 다음과 같은 오류가 발생합니다.

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

해결 방법

실패한 SOAPMessageValidation 정책의 <Source> 요소에 설정된 변수가 정의되고 정책이 실행되는 흐름에 있는지 확인합니다.

위의 예시를 수정하려면 <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"
    }
  }
}

원인

이 오류는 SOAPMessageValidation 정책의 <Source> 요소가 메시지 유형이 아닌 변수로 설정된 경우 발생합니다.

메시지 유형 변수는 전체 HTTP 요청 및 응답을 나타냅니다. 기본 제공되는 Apigee Edge 흐름 변수 request, response, message는 메시지 유형입니다. message 변수에 대한 자세한 내용은 변수 참조를 확인하세요.

진단

  1. 오류 문자열에서 메시지 유형으로 확인되지 않는 변수의 이름을 식별합니다. 예를 들어 다음 오류 문자열에서 변수 이름은 message.content입니다.

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. 오류가 발생한 특정 API 프록시의 모든 SOAPMessageValidation 정책을 검사합니다. 하나 이상의 SOAPMessageValidation 정책이 있을 수 있습니다. <Source> 요소에 지정된 변수가 오류 문자열(위의 1단계)에서 식별되는 변수 이름과 일치하는 특정 SOAPMessageValidation 정책 또는 그 외 정책을 식별합니다.

    예를 들어 다음 정책은 <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"
    

해결 방법

실패한 SOAPMessageValidation 정책의 <Source> 요소가 정책이 실행되는 흐름에 있는 메시지 유형 변수로 설정되었는지 확인합니다.

정책을 수정하려면 <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"
    }
  }
}

원인

이 오류는 SOAPMessageValidation 정책이 XSD 스키마 또는 WSDL 정의에 대해 입력 메시지 페이로드의 유효성을 검사하는 데 실패하는 경우 발생합니다. 페이로드 메시지에 잘못된 JSON 또는 XML이 있는 경우에도 이 오류가 발생합니다.

이 오류가 발생할 수 있는 원인은 다음과 같습니다.

원인 설명
XML 페이로드 불일치 입력 XML 페이로드가 SoapMessageValidation 정책에 지정된 XSD 스키마를 준수하지 않습니다.
SOAP 페이로드 불일치 입력 SOAP 페이로드가 SoapMessageValidation 정책에 지정된 WSDL 정의를 준수하지 않습니다.
잘못된 형식의 JSON 또는 XML 입력 SOAP 페이로드에 올바른 형식의 XML 또는 JSON이 포함되지 않습니다.

원인: XML 페이로드 불일치

이 오류는 입력 XML 페이로드가 SoapMessageValidation 정책의 <ResourceURL> 요소에 지정된 XSD 스키마를 준수하지 않는 경우에 발생합니다.

오류 메시지 예

{
  "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 정책에는 <ResourceURL> 요소에 XSD 리소스 파일이 있습니다.

    <?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. SOAPMessageValidation 정책에서 사용되는 XML 스키마 정의 파일 Script-1.xsd를 검사하여 <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> 하위 요소만 필요하다고 판단되면 SOAPMessageValidation 정책에 사용되는 Script-1.xsd를 수정할 수 있습니다. 다음과 같이 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 페이로드가 SoapMessageValidation 정책의 <ResourceURL> 요소에 지정된 WSDL 정의를 준수하지 않는 경우에 발생합니다.

오류 메시지 예

{
  "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 정책에는 <ResourceURL> 요소에 wsdl 리소스 파일이 있습니다.

    <?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번째 줄에는 <shipTo> 요소 아래에 하위 요소 <country>가 있습니다.

  4. SOAPMessageValidation 정책에 사용된 WSDL 정의 파일 SOAP-Message-Validation-1.wsdl를 검사하여 <shipTo> 요소의 하위 요소 <country>에 어떤 문제가 있는지 확인합니다.

    <?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 정의가 올바르지 않다고 판단되면 SOAPMessageValidation 정책에 사용되는 SOAP-Message-Validation-1.wsdl을 변경할 수 있습니다. 다음과 같이 파일을 수정하여 위의 페이로드 예시를 검증할 수 있습니다.

...
<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 페이로드가 SoapMessageValidation 정책의 <ResourceURL> 요소에 지정된 WSDL 정의를 준수하지 않는 경우에 발생합니다.

오류 메시지 예

{
  "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 정책 이름, 실패 이유, WSDL 정의와 일치하지 않는 XML 페이로드의 줄 번호를 식별합니다. 이러한 모든 정보는 오류 문자열에서 찾을 수 있습니다. 예를 들어 다음 오류 문자열에서 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>
    

    위 예시에서는 입력 XML의 15번째 줄에 <title> 요소가 있지만 </title> 종료 태그로 닫혀 있지 않습니다.

해결 방법

오류를 해결하려면 입력 페이로드가 유효하고 올바르게 구성되었는지 확인하세요.

예를 들어 다음과 같이 입력 XML 페이로드를 수정할 수 있습니다.

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