0

我有一个程序使用 HttpClient 进行 API 调用并覆盖 DelegatingHandler 类以在失败时重试请求,如下所示。

class TestHandler
{

    public static void APICallTest()
    {
        var handler = new HttpClientHandler() { Credentials = CredentialCache.DefaultNetworkCredentials };
        var client = new HttpClient(new RetryMessageHandler(handler));


        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Clear();
        client.Timeout = TimeSpan.FromSeconds(90);

        client.DefaultRequestHeaders.Host = "lab.abc.xyz.def.net";

        ServicePointManager.ServerCertificateValidationCallback 
            += (sender, cert, chain, sslPolicyErrors) => true;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | 
            SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

        for (int i = 0; i < 499; i++)
        {
            try
            {
                using (HttpResponseMessage res = 
                    client.GetAsync("https://abc.xyz.def.net/rest/").Result)
                {
                    if (res != null)
                    {
                        Console.WriteLine("response: " + res);
                    }
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }
    }

}

public class RetryMessageHandler : DelegatingHandler
{
    public RetryMessageHandler(HttpMessageHandler innerhandler):base(innerhandler)
    {

    }
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        HttpResponseMessage response = null;
        var exceptions = new List<Exception>();
        for (int attempt = 0; attempt < 3; attempt++)
        {
            await Task.Delay(5 * attempt).ConfigureAwait(false);
            try
            {
                response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);

            }
            catch (System.Net.Http.HttpRequestException ex)
            {
                exceptions.Add(ex);
            }
        }

        throw new AggregateException(exceptions);

    }
}

该程序适用于 API 的成功响应。在 500 个请求中,有 2-3 个请求因 Forbidden 403 而失败。不成功的 API 调用是随机的。API 服务器中的日志显示失败的请求没有凭据。

有人知道随机失败的原因吗?如何检查是否在每个请求中都发送了 Credentails?

4

0 回答 0