다음을 통해 공유


SOAP 기반 API는 404 및 500 HTTP 상태 코드를 반환합니다.

Azure API Management 문제 해결 시리즈에 대한 문서를 참조하는 이 시나리오는 랩의 두 번째 시나리오입니다. 이에 따라 랩 설정 지침을 따라 문제를 다시 만들어야 합니다.

원래 제품 버전: API Management 서비스
원래 KB 번호: 4464934

증상

계산기 API는 두 개의 입력 매개 변수 intA 및 intB를 기반으로 추가, 기, 곱하기 및 나누기네 가지 작업을 수행할 수 있습니다. 작업의 이름은 수행하는 함수에 대한 설명입니다. SOAP 1.1 프로토콜을 따르는 ASMX 서비스http://www.dneonline.com/calculator.asmx이므로 입력 매개 변수가 SOAP 봉투 본문 섹션에 전달됩니다. 추가 및 빼기 작업은 예상대로 제대로 작동하지만 나누기 작업을 호출하는 동안 곱하기 작업 및 HTTP 500을 호출하는 동안 HTTP 404가 발생합니다.

곱하기 작업의 예상 출력은 다음과 같아야 합니다.

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soap:Body>
      <MultiplyResponse xmlns="http://tempuri.org/">
         <MultiplyResult>int</MultiplyResult>
      </MultiplyResponse>
   </soap:Body>
</soap:Envelope>

나누기 작업의 예상 출력은 다음과 같아야 합니다.

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soap:Body>
      <DivideResponse xmlns="http://tempuri.org/">
         <DivideResult>int</DivideResult>
      </DivideResponse>
   </soap:Body>
</soap:Envelope>

문제 해결 단계

이러한 HTTP 404 및 500 응답, APIM 또는 백 엔드 SOAP API를 throw하는 사용자를 이해해야 합니다. 이 답변을 얻는 가장 좋은 방법은 APIM 검사기 추적을 수집하여 요청 및 응답을 검사하는 것입니다.

  • HTTP를 throw하는 곱하기 작업 - 404(찾을 수 없음) 상태 코드는 원본 서버가 대상 리소스에 대한 현재 표현을 찾지 못했거나 해당 리소스가 있음을 공개하지 않음을 나타냅니다.

  • APIM 검사기 추적의 백 엔드 섹션을 검사하는 경우 메시지에서도 동일한 관찰이 분명합니다.

    {
      "backend": [
        {
          "source": "configuration",
          "timestamp": "2018-07-29T12:30:08.3500317Z",
          "elapsed": "00:00:00.7276962",
          "data": {
            "message": "Unable to identify Api or Operation for this request. Responding to the caller with 404 Resource Not Found."
          }
        }
      ]
    }
    
  • 따라서 먼저 테스트 탭에서 APIM에서 백 엔드 API로 전송된 요청 URL 및 헤더를 검사하고 곱하기 작업에 http://www.dneonline.com/calculator.asmx대한 SOAP 요청 샘플과 비교해야 합니다.

    APIM 검사기 추적의 요청 헤더는 다음과 같습니다.

    {
      "data": {
        "request": {
          "method": "POST",
          "url": "https://pratyay.azure-api.net/calc",
          "headers": [
            {
              "name": "Ocp-Apim-Subscription-Key",
              "value": "34ae22db7f2c4c5da7b74a55adf03223"
            },
            {
              "name": "X-Forwarded-For",
              "value": "223.226.79.35"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            },
            {
              "name": "Connection",
              "value": "Keep-Alive"
            },
            {
              "name": "Content-Length",
              "value": "292"
            },
            {
              "name": "Content-Type",
              "value": "application/soap+xml; action=http://tempuri.org/Multiply"
            },
            {
              "name": "Accept",
              "value": "*/*"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip,deflate,br"
            },
            {
              "name": "Accept-Language",
              "value": "en-US,en;q=0.5"
            },
            {
              "name": "Host",
              "value": "pratyay.azure-api.net"
            },
            {
              "name": "Referer",
              "value": "https://apimanagement.hosting.portal.azure.net/apimanagement/Content/1.0.385.3/apimap/apimap-apis/index.html?locale=en&trustedAuthority=https://ms.portal.azure.com"
            }
          ]
        }
      }
    }
    
  • 백 엔드 ASMX 서비스 정의에 따라 SOAP 1.1 요청에 APIM에서 보낸 요청에 누락된 요청 헤더 **SOAPAction이 필요합니다.

    Host: www.dneonline.com
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://tempuri.org/Multiply"
    
  • http://tempuri.org/Multiply 이 포함된 SOAPAction 헤더를 추가하면 문제가 해결됩니다. 곱하기 작업의 프런트 엔드 정의 아래에 요청 헤더를 추가하고 각 요청에 대해 매번 해당 헤더를 보낼 필요가 없도록 헤더 탭에서 값을 기본값으로 설정할 수 있습니다.

    값이 있는 SOAPAction 헤더가 추가되는 헤더 탭의 스크린샷.

  • HTTP 500(내부 서버 오류) 상태 코드를 throw하는 나누기 작업은 서버가 요청을 처리하지 못하게 하는 예기치 않은 조건이 발생했음을 나타냅니다.

  • 즉, 백 엔드 서비스는 APIM에서 보낸 요청 본문을 처리할 수 없습니다. APIM에서 보낸 요청 본문을 검사할 수 있습니다.

  • SOAP 본문을 확인하면 분모(intB)가 0으로 설정되어 처리되지 않은 예외가 발생하므로 HTTP 500(내부 서버 오류)이 발생합니다.

    POST calc HTTP/1.1
    
    Host: pratyay.azure-api.net
    SOAPAction: http://tempuri.org/Divide
    Cache-Control: no-cache
    Ocp-Apim-Trace: true
    Content-Type: application/soap+xml; action=http://tempuri.org/Divide
    Ocp-Apim-Subscription-Key: ********************************
    
    <?xml version="1.0" encoding="utf-8"?>
    <Envelope xmlns="http://www.w3.org/2003/05/soap-envelope">
      <Body>
        <Divide xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/">
          <intA>1</intA>
          <intB>0</intB>
        </Divide>
      </Body>
    </Envelope>
    
  • 나누기 작업의 프런트 엔드 정의에 있는 요청 탭에서 요청 콘텐츠 표현을 확인하면 intB 값이 0으로 설정됩니다. intB 값을 0이 아닌 값으로 변경해야 하며 문제를 해결해야 합니다.

    0으로 설정된 intB 값의 스크린샷

도움을 요청하십시오.

질문이 있거나 도움이 필요한 경우 지원 요청을 생성하거나Azure 커뮤니티 지원에 문의하세요. Azure 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.