Повторный запрос заканчивается «Несоответствие длины содержимого» - PullRequest
0 голосов
/ 12 февраля 2019

Моя проблема решается следующим образом:

У меня есть 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 Ответ

0 голосов
/ 12 февраля 2019

Это потому, что запрос, отправленный клиентом, не кэшируется в памяти по умолчанию в 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...