Обработка ошибок в политиках управления API

ОБЛАСТЬ ПРИМЕНЕНИЯ: все уровни управления API

Предоставляя объект ProxyError, Azure API Management позволяет издателям реагировать на условия ошибки, которые могут возникать во время обработки запросов. Доступ к объекту ProxyError осуществляется через свойство контекст.LastError. Политики в разделе on-error могут использовать объект ProxyError. Эта статья содержит справочную информацию о возможностях обработки ошибок, которые предоставляет служба управления API Azure.

Обработка ошибок в службе управления API

Политики в службе управления API Azure включают разделы inbound, backend, outbound и on-error, как показано в следующем примере.

<policies>
    <inbound>
        <!-- statements to be applied to the request go here -->
    </inbound>
    <backend>
        <!-- statements to be applied before the request is
             forwarded to the backend service go here -->
    </backend>
    <outbound>
        <!-- statements to be applied to the response go here -->
    </outbound>
    <on-error>
        <!-- statements to be applied if there is an error
             condition go here -->
    </on-error>
</policies>

Во время обработки запроса встроенные шаги выполняются вместе с любыми политиками, которые относятся к запросу. Если возникает ошибка, обработка немедленно переходит к разделу on-error политики.

Раздел политики on-error можно использовать в любой области. Издатели API могут настроить поведение, например, логирование ошибок в Центры событий Azure или создание нового ответа для возврата вызывающей стороне.

Примечание.

Этот on-error раздел не присутствует в политиках по умолчанию. Чтобы добавить в политику раздел on-error, перейдите к требуемой политике в редакторе политик и добавьте раздел. Дополнительные сведения о настройке политик см. в статье Политики в Azure API Management.

Если нет on-error раздела, вызывающие получают 400 или 500 сообщений HTTP-ответов, если возникает ошибка.

Политики, которые можно использовать в разделе on-error

В разделе on-error можно использовать следующие политики.

ПоследняяОшибка

При возникновении ошибки и переходе управления программы в on-error раздел политики, ошибка сохраняется в свойстве контекста LastError. Политики в разделе on-error могут получить доступ к context.LastError. LastError имеет следующие свойства.

Имя. Тип Описание Обязательное поле
Source строка Имя элемента, в котором произошла ошибка. Это может быть либо политика, либо имя встроенного шага конвейера. Да
Reason строка Код ошибки в машинном формате, который удобно использовать для обработки ошибок. Нет
Message строка Описание ошибки в понятном для человека формате. Да
Scope строка Имя области, в которой произошла ошибка. Нет
Section строка Имя раздела, в котором произошла ошибка. Возможные значения: inbound, backend, outboundили on-error. Нет
Path строка Указывает вложенную иерархию политик, например choose[3]\\when[2]. Несколько экземпляров вложенной политики индексируются, начиная с 1. Нет
PolicyId строка Значение атрибута id для политики, в которой произошла ошибка (если указано клиентом). Нет

Совет

Вы можете получить доступ к коду состояния с помощью context.Response.StatusCode.

Примечание.

Все политики имеют дополнительный атрибут id, который может быть добавлен к корневому элементу политики. Если этот атрибут присутствует в политике при возникновении условия ошибки, можно получить значение атрибута с помощью context.LastError.PolicyId свойства.

Стандартные ошибки для встроенных шагов

Далее перечислены стандартные ошибки, которые могут возникать во время оценки встроенных шагов обработки.

Источник Состояние Причина Сообщение
настройка URI не соответствует ни одному API или операции OperationNotFound Unable to match incoming request to an operation. (Не удалось сопоставить входящий запрос с операцией.)
авторизация Не предоставлен ключ подписки Ключ подписки не найден Доступ запрещен из-за отсутствия ключа подписки. Убедитесь, что вы включаете ключ подписки при отправке запросов к этому API.
авторизация Недопустимое значение ключа подписки НеверныйКлючПодписки Доступ запрещен из-за недопустимого ключа подписки. Убедитесь, что предоставлен допустимый ключ для активной подписки.
несколько Клиент прервал нисходящее подключение от клиента к шлюзу управления API во время ожидания запроса. Ошибка подключения клиента несколько
несколько Серверная часть была прервана или не смогла установить входящее соединение (от шлюза управления API к серверной службе) Сбой соединения с сервером Backend несколько
несколько Исключение среды выполнения произошло во время оценки конкретного выражения Ошибка оценки значения выражения несколько

Стандартные ошибки для политик

Далее перечислены стандартные ошибки, которые могут возникнуть во время оценки политик.

Источник Состояние Причина Сообщение
ограничение частоты Превышено ограничение скорости Превышено ограничение скорости запросов Rate limit is exceeded (Превышено ограничение скорости)
квота Превышена квота Квота превышена превышена квота на количество вызовов. Quota will be replenished in xx:xx:xx. (Квота будет пополнена в xx:xx:xx.) -или- Превышена квота пропускной способности. Quota will be replenished in xx:xx:xx. (Квота будет пополнена в xx:xx:xx.)
jsonp Недопустимое значение параметра обратного вызова (содержит неправильные символы) Недопустимый параметр обратного вызова Value of callback parameter {callback-parameter-name} is not a valid JavaScript identifier. (Значение параметра обратного вызова {имя параметра обратного вызова} не является допустимым идентификатором JavaScript.)
IP-фильтр Не удалось проанализировать IP-адрес вызывающего объекта из запроса Не удалось разобрать IP-адрес вызывающего абонента Не удалось установить IP-адрес вызывающего объекта. Доступ запрещен.
IP-фильтр IP-адрес вызывающего абонента не указан в списке разрешенных Запрещённый IP вызывающего IP-адрес звонящего {ip-address} не разрешен. Доступ запрещен.
IP-фильтр IP-адрес вызывающего объекта включен в список заблокированных БлокировкаIPЗвонящего IP-адрес вызывающего абонента заблокирован. Доступ запрещен.
проверить заголовок Отсутствует обязательный заголовок или его значение отсутствует ЗаголовокНеНайден В запросе не найден заголовок {header-name}. Доступ запрещен.
проверить заголовок Отсутствует обязательный заголовок или его значение отсутствует ЗначениеЗаголовкаНеДопустимо Значение заголовка {header-name} равно {header-value} не допускается. Доступ запрещен.
проверка JWT Веб-токен JSON (JWT) отсутствует в запросе Токен отсутствует JWT отсутствует.
проверка JWT Ошибка при проверке подписи Недействительная подпись токена <сообщение из библиотеки jwt>. Доступ запрещен.
проверка JWT Неверная аудитория АудиторияТокенаНеРазрешена <сообщение из библиотеки jwt>. Доступ запрещен.
проверка JWT Недопустимый эмитент Выдающий токены не разрешен <сообщение из библиотеки jwt>. Доступ запрещен.
проверка JWT Истек срок действия маркера Срок действия токена истёк <сообщение из библиотеки jwt>. Доступ запрещен.
проверка JWT Ключ подписи не был определен идентификатором Ключ подписи токена не найден <сообщение из библиотеки jwt>. Доступ запрещен.
проверка JWT В маркере отсутствуют необходимые утверждения Требование токена не найдено JWT отсутствуют следующие утверждения: <c1>, <c2>, ... Доступ запрещен.
проверка JWT Несоответствие значений утверждения Значение токена не разрешено Не допускается утверждение {claim-name} значения {claim-value}. Доступ запрещен.
проверка JWT Прочие сбои при проверке данных JwtInvalid <сообщение из библиотеки jwt>
перенаправление запроса или отправка запроса Код состояния http-ответа и заголовки не были получены из серверной части в течение настроенного времени ожидания Время ожидания несколько

Пример

Задайте для политики API следующее значение:

<policies>
    <inbound>
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <set-header name="ErrorSource" exists-action="override">
            <value>@(context.LastError.Source)</value>
        </set-header>
        <set-header name="ErrorReason" exists-action="override">
            <value>@(context.LastError.Reason)</value>
        </set-header>
        <set-header name="ErrorMessage" exists-action="override">
            <value>@(context.LastError.Message)</value>
        </set-header>
        <set-header name="ErrorScope" exists-action="override">
            <value>@(context.LastError.Scope)</value>
        </set-header>
        <set-header name="ErrorSection" exists-action="override">
            <value>@(context.LastError.Section)</value>
        </set-header>
        <set-header name="ErrorPath" exists-action="override">
            <value>@(context.LastError.Path)</value>
        </set-header>
        <set-header name="ErrorPolicyId" exists-action="override">
            <value>@(context.LastError.PolicyId)</value>
        </set-header>
        <set-header name="ErrorStatusCode" exists-action="override">
            <value>@(context.Response.StatusCode.ToString())</value>
        </set-header>
        <base />
    </on-error>
</policies>

Отправка несанкционированного запроса приводит к следующему ответу:

Снимок экрана: ответ на пример, содержащий сообщение об ошибке.

Дополнительные сведения о работе с политиками см. в нижеуказанных статьях.