HttpClient.SendAsync()进行多次调用

时间:2017-08-09 03:29:29

标签: .net dotnet-httpclient

我有一个使用API​​的Swagger文档生成的API客户端。所有的电话都可以正常工作,除了一个。

不起作用的那个似乎是自动重试,而其他人都没有。它总共发送四个请求。第二个紧接在第一个之后,然后第三个和第四个以十秒为间隔。

以下是客户端生成的一些代码:

    ...
    // Send Request
    if (_shouldTrace)
    {
        ServiceClientTracing.SendRequest(_invocationId, _httpRequest);
    }
    cancellationToken.ThrowIfCancellationRequested();
*   _httpResponse = await this.Client.HttpClient.SendAsync(_httpRequest, cancellationToken).ConfigureAwait(false);
*   if (_shouldTrace)
    {
        ServiceClientTracing.ReceiveResponse(_invocationId, _httpResponse);
    }
    HttpStatusCode _statusCode = _httpResponse.StatusCode;
    cancellationToken.ThrowIfCancellationRequested();
    ...

我在*的两行设置了断点。使用Fiddler,我可以看到所有四个调用都在第二个断点被触发之前发生。

我无法在请求中找到任何类型的重试策略。我查看了SendAsync() source,但它不包含我可以看到的重试逻辑。

我对此感到非常困惑。

编辑1:

每次发送请求时,我都会返回500。但是,由于API不完整,我们现在应该这样做了。

1 个答案:

答案 0 :(得分:1)

答案来自一位同事。我需要手动定义重试策略。他提出了这个课程(可能来自谷歌):

public class HttpTransientErrorDetectionStrategy
    : ITransientErrorDetectionStrategy
{
    private readonly List<HttpStatusCode> _statusCodes =
        new List<HttpStatusCode>
            {
                HttpStatusCode.GatewayTimeout,
                HttpStatusCode.RequestTimeout,
                HttpStatusCode.ServiceUnavailable,
            };

    public HttpTransientErrorDetectionStrategy(bool isNotFoundAsTransient = false)
    {
        if (isNotFoundAsTransient)
            _statusCodes.Add(HttpStatusCode.NotFound);
    }

    public bool IsTransient(Exception ex)
    {
        var we = ex as WebException;
        if (we == null)
            return false;

        var response = we.Response as HttpWebResponse;

        var isTransient = response != null
                          && _statusCodes.Contains(response.StatusCode);
        return isTransient;
    }

并在客户的CustomInitialize()方法中使用此行:

SetRetryPolicy(new RetryPolicy(new HttpTransientErrorDetectionStrategy(), 0));