重试请求以 "Content length mismatch" 结尾

Retry request ends with "Content length mismatch"

我的问题是这样的:

我有一个 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>

服务器return第一次成功(状态码:200),当它启动重试时遇到以下(我也在重试成功, 用于测试重试工作正常。).

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

请帮助您thoughts/experience。

这是因为在 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>

forward-request 策略中使用属性 buffer-request-body 似乎有一种包含正文的替代简化方法:

<!-- 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 for forward-request's attributes