using Microsoft.Extensions.Caching.Memory; using System.Net; using System.Net.Http; using System.Threading.Tasks; using System.Xml.Linq; namespace RhSolutions.Services; public class CurrencyClient : ICurrencyClient { private readonly HttpClient _httpClient; private readonly IMemoryCache _memoryCache; private const string requestAddress = @"https://www.cbr.ru/scripts/XML_daily.asp?date_req="; public HttpStatusCode StatusCode { get; private set; } public CurrencyClient(HttpClient httpClient, IMemoryCache memoryCache) { _httpClient = httpClient; _memoryCache = memoryCache; } public async Task GetCurrencyCourse(DateTime date) { if (!_memoryCache.TryGetValue(date, out decimal? exchangeRate)) { string request = $"{requestAddress}{date.Date:dd/MM/yyyy}"; HttpResponseMessage response = await _httpClient.GetAsync(request); try { response.EnsureSuccessStatusCode(); string xml = await response.Content.ReadAsStringAsync(); XElement valCourses = XElement.Parse(xml); exchangeRate = decimal.Parse(valCourses.Elements("Valute") .Where(e => e.Element("Name").Value == "Евро") .FirstOrDefault() .Element("Value").Value); return exchangeRate; } catch { StatusCode = response.StatusCode; exchangeRate = null; } var cacheEntryOptions = new MemoryCacheEntryOptions() .SetSlidingExpiration(TimeSpan.FromHours(1)); _memoryCache.Set(date, exchangeRate, cacheEntryOptions); } return exchangeRate; } }