C# HttpClient MessageHandler случайно запрещено

У меня есть программа, которая выполняет вызов API, используя HttpClient и переопределяющий класс 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 в каждом запросе?

0 ответов

Другие вопросы по тегам