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 в каждом запросе?