Повторный запрос заканчивается "Несоответствие длины содержимого"
Моя проблема идет так:
У меня есть 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>