private async Task <LoanQuote> SendLoanRequest(LoanQuoteRequest loanQuoteRequest, IRegisteredBank bank, HttpClient httpClient) { httpClient.BaseAddress = bank.BaseUri; var stringContent = new StringContent(JsonConvert.SerializeObject(loanQuoteRequest), Encoding.UTF8, "application/json"); var response = await httpClient.PutAsync(bank.Endpoint, stringContent); if (!response.IsSuccessStatusCode) { logger.Error("Loan quote {@request} sending to {bank} failed : " + $"{response.StatusCode}: {response.ReasonPhrase}", loanQuoteRequest, bank.Name); return(null); } else { var content = await response.Content.ReadAsStringAsync(); var quoteResponse = JsonConvert.DeserializeObject <LoanQuote>(content); logger.Information( "Request {@request} succeeded! Request was successfully processed by {bank}! Response was {@response}", loanQuoteRequest, bank.Name, quoteResponse); return(quoteResponse); } }
private async Task <LoanQuote> ExecuteWithResilience(LoanQuoteRequest loanQuoteRequest, IRegisteredBank bank) { return(await resiliencePolicy.Execute(async() => { using (var httpClient = new HttpClient(httpMessageHandlerFactory.Create(), true)) { return await SendLoanRequest(loanQuoteRequest, bank, httpClient); } })); }
public async Task <LoanQuoteResponse> GetLoanQuotesFromRegisteredBanks(LoanQuoteRequest loanQuoteRequest) { var loanQuoteResponse = new LoanQuoteResponse(); loanQuoteResponse.BSN = loanQuoteRequest.BSN; loanQuoteResponse.OriginalAmountRequested = loanQuoteRequest.LoanAmount; var allRegisteredBanks = RegisteredBanks.All(); foreach (var bank in allRegisteredBanks) { logger.Information("Sending {@request} to {bank} bank ...", loanQuoteRequest, bank.Name); var result = await ExecuteWithResilience(loanQuoteRequest, bank); if (result != null) { loanQuoteResponse.Quotes.Add(result); } } return(loanQuoteResponse); }