Корректное использование 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). вроде всё работает, постарался оптимизировать как мог. М.б. я что то упускаю, в данном ключе ?