重试请求以“内容长度不匹配”结束

时间:2019-02-12 11:14:35

标签: azure azure-api-management retrypolicy

我的问题是这样的:

我有一个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),当它启动重试时,它遇到以下情况( 我也在重试其成功,用于测试重试是否正常。< / em> )。

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

请在同一方面帮助您提供您的想法/经验。

2 个答案:

答案 0 :(得分:3)

这是因为默认情况下,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>

答案 1 :(得分:0)

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