using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Polly.Extensions.Http;
using System.Net.Http.Headers;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
public static async Task Main()
var services = new ServiceCollection();
services.AddLogging(b => b.AddConsole());
services.AddHttpClient<MyService>()
.SetHandlerLifetime(TimeSpan.FromMinutes(5))
.AddPolicyHandler(GetRetryPolicy());
services.AddScoped<MyService>();
using (var scope = services.BuildServiceProvider().CreateScope())
var sp = scope.ServiceProvider;
var service = sp.GetRequiredService<MyService>();
await service.MakeRequestCallsAsync();
static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
return HttpPolicyExtensions
.HandleTransientHttpError()
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
private readonly ILogger _logger;
private readonly string _username = "";
private readonly string _password = "";
private readonly HttpClient _client;
public MyService(HttpClient client, ILogger<MyService> logger)
_client.DefaultRequestHeaders.Accept.Clear();
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(_username + ":" + _password)));
public async Task MakeRequestCallsAsync()
var request1 = await ExecuteNextRequestAsync<object, ResponseObject>(null!, (input) =>
return "https://dummyjson.com/products";
var request2 = await ExecuteNextRequestAsync<ResponseObject, ResponseProduct>(request1, (input) =>
return "https://dummyjson.com/products/" + input.Products.ElementAt(0).Id;
private async Task<TOut> ExecuteNextRequestAsync<TIn, TOut>(TIn lastResponse, Func<TIn, string> factory)
var url = factory(lastResponse);
var response = await _client.GetAsync(url);
if (response.IsSuccessStatusCode)
var responseJson = await response.Content.ReadAsStringAsync();
_logger.LogInformation($"{responseJson}");
var responseObj = JsonSerializer.Deserialize<TOut>(responseJson);
_logger.LogError($"{response.StatusCode}");
[JsonPropertyName("products")]
public ResponseProduct[] Products { get; set; }
public int Id { get; set; }
[JsonPropertyName("title")]
public string Title { get; set; }
[JsonPropertyName("brand")]
public string Brand { get; set; }