Поделиться через


API на основе SOAP возвращает коды состояния HTTP 404 и 500

Ссылаясь на статью в Azure Управление API серии устранения неполадок, это второй сценарий лаборатории. Убедитесь, что вы выполнили инструкции по настройке лаборатории, чтобы повторно создать проблему.

Исходная версия продукта: служба Управление API
Исходный номер базы знаний: 4464934

Симптомы

API калькулятора может выполнять четыре операции: добавление, вычитание, умножение и деление на основе двух входных параметров intA и intB. Имя операций является самоуяснительным для того, какую функцию они выполняют. Это служба ASMX (http://www.dneonline.com/calculator.asmx) после протокола SOAP 1.1, поэтому входные параметры передаются в разделе тела конверта 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 или внутренний API SOAP. Лучший способ получить этот ответ — собрать трассировку инспектора APIM для проверки запроса и ответа.

  • Операция умножения, вызывающая код состояния HTTP - 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."
          }
        }
      ]
    }
    
  • Поэтому сначала следует проверить URL-адрес запроса и заголовки, отправленные из APIM на серверную часть API на вкладке "Тест" и сравнить его с примером запроса SOAP для операции умножения . http://www.dneonline.com/calculator.asmx

    Заголовки запросов из трассировки инспектора 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 требует заголовка запроса **SOAPAction, отсутствующего в запросе, отправленном из APIM.

    Host: www.dneonline.com
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://tempuri.org/Multiply"
    
  • Добавление заголовка SOAPAction со значением http://tempuri.org/Multiply приведет к устранению проблемы. Вы можете добавить заголовок запроса в определение операции умножения и задать значение по умолчанию на вкладке "Заголовки" , чтобы не отправлять этот заголовок каждый раз при каждом запросе.

    Снимок экрана: вкладка

  • Операция деления, вызывающая код состояния HTTP 500 (внутренняя ошибка сервера), указывает, что сервер столкнулся с непредвиденным условием, которое не позволило выполнить запрос.

  • Другими словами, серверная служба не может обрабатывать текст запроса, отправленный из APIM. Вы можете проверить текст запроса, отправленный из APIM.

  • При проверке текста SOAP вы заметите, что знаменатель (intB) имеет значение нулю, что приводит к необработанным исключениям, что приводит к возникновению ошибки 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>
    
  • Если проверить представление содержимого запроса на вкладке "Запрос ", присутствующих в определении frontend операции деления, вы заметите, что значение intB равно нулю. Необходимо изменить значение intB на ненулевое значение и устранить проблему.

    Снимок экрана: значение intB, равное нулю.

Свяжитесь с нами для получения помощи

Если у вас есть вопросы или вам нужна помощь, создайте запрос в службу поддержки или обратитесь за поддержкой сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.