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 на ненулевое значение и устранить проблему.
Свяжитесь с нами для получения помощи
Если у вас есть вопросы или вам нужна помощь, создайте запрос в службу поддержки или обратитесь за поддержкой сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.