Корректное использование HttpClient

Вкратце опишу логику (клиент стучиться сначала к моему сервису, я отправляю запрос в БД, и достаю данные клиента. Затем я отправляю телефон клиента на сторонний апи, и он мне возвращает данные в формате Json. Если такой клиент у них есть, сверяю данные по определённым полям. Если они сходятся, то возвращаю Id из моей БД, если они отличаются, обновляю данные в моей БД новыми данными из ответа стороннего API, и снова возвращаю Id записи). Вся модель асинхронная. Метод в Webapi-controller вызывает ClassLibrary. В ClassLibrary организована логика, которая стучится на сторонний API (Get, Put, Post - queries). Работаю с HttpClient(). Из статьи YOU'RE USING HTTPCLIENT WRONG AND IT IS DESTABILIZING YOUR SOFTWARE вынес для себя полезное, что нужно ипользовать static HttpClient(), т.к. подключения могут оставаться открытыми. Когда приходит ответ от сервера, я использую ReadAsStreamAsync() вместо ReadAsStringAsync(), и далее JsonConvert.DeserializeObject(stream). Вот пример моего кода (привожу описание только одного запроса, логика остальных методов построена тем же способом): `

public class SomeClient
{
    private static ILogger _logger = LogManager.GetCurrentClassLogger();
    public static HttpClient _httpClient {get;set;}
    public SomeClient()
        {
            _httpClient = new HttpClient
            {
                BaseAddress = new Uri(ConfigurationManager.AppSettings["apiUrl"])
            };
    }
    public async Task<T> Binding<T>(string _urlApiMethod) where T : class
        {
            _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            HttpRequestMessage _request = new HttpRequestMessage(HttpMethod.Put, _urlApiMethod);
            using (var response = await _httpClient.SendAsync(_request))
            {
                var stream = await response.Content.ReadAsStreamAsync();
                if (response.IsSuccessStatusCode)
                {
                    return DeserializeJsonFromStream<T>(stream);
                }
                var content = await StreamToStringAsync(stream);
                var exception = new ApiException
                {
                    StatusCode = (int)response.StatusCode,
                    Content = content
                };
                _logger.Error($"UrlApiMethod {_urlApiMethod} has error: {exception.Content} | status code: {exception.StatusCode}");
                throw exception;
            }
        }`

На сервис будут обращаться порядка 1000 пользователей в минуту. Проводил тесты только ссылался на фейковый Api (JsonPlaceholder). вроде всё работает, постарался оптимизировать как мог. М.б. я что то упускаю, в данном ключе ?


Ответы (0 шт):