Повторный запрос заканчивается "Несоответствие длины содержимого"

Моя проблема идет так:

У меня есть Azure APIM, я создал API и добавил политику повторных попыток бэкэнда, как показано ниже.

<backend>
    <retry condition="@("{{Transient-ErrorCode}}".Contains(Convert.ToString(context.Response.StatusCode)))" count="3" interval="5" first-fast-retry="false">
        <forward-request />
    </retry>
</backend>

Сервер возвращает успешный результат (код состояния: 200) в первый раз. Когда он инициировал повторную попытку, он обнаружил следующее (я также повторяю попытку, поскольку проверка повторной попытки работает нормально.).

forward-request (1.326 ms)
{
"messages": [
    "Content length mismatch",
    "Content length mismatch"
    ]
}

Пожалуйста, помогите с вашими мыслями / опытом на то же самое.

1 ответ

Решение

Это связано с тем, что запрос, отправленный клиентом, не кэшируется в памяти по умолчанию в APIM, а направляется прямо от клиента к бэкэнду. Таким образом, когда необходимо повторить запрос, полезной нагрузки запроса не существует. Я предполагаю, что у вас есть проблемы только с запросами, которые имеют тело.

Чтобы решить проблему, сначала необходимо кешировать тело запроса:

<inbound>
    <set-variable name="body" value="@(context.Request.Body.As<string>(preserveContent: true))" />
</inbound>
<backend>
    <retry condition="@("{{Transient-ErrorCode}}".Contains(Convert.ToString(context.Response.StatusCode)))" count="3" interval="5" first-fast-retry="false">
        <set-body>@((string)context.Variables["body"])</set-body>
        <forward-request />
    </retry>
</backend>

Кажется, существует альтернативное упрощение для включения тела с помощью атрибута buffer-request-body на forward-request политика:

<!-- no need to put body into variable in the inbound policy -->
<backend>
    <retry condition="@("{{Transient-ErrorCode}}".Contains(Convert.ToString(context.Response.StatusCode)))" count="3" interval="5" first-fast-retry="false">
        <!-- no need for the set-body policy -->
        <forward-request buffer-request-body="true" />
    </retry>
</backend>

См. Doco для атрибутов форвард-запроса

Другие вопросы по тегам