Работали ли вы с HttpClient в .NET?

«Работали ли вы с HttpClient в .NET?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, интенсивно использовал HttpClient. Ключевой момент — правильное управление его жизненным циклом для предотвращения проблем с производительностью, таких как исчерпание сокетов.

Рекомендуемый подход: использовать IHttpClientFactory.

Почему это важно? Прямое создание и удаление HttpClient в using блоке для каждого запроса может привести к задержкам в освобождении сетевых ресурсов. Фабрика управляет пулом HttpMessageHandler, что решает эту проблему.

Пример настройки и использования через DI:

  1. Регистрация в Startup.cs / Program.cs:

    // Базовая регистрация
    builder.Services.AddHttpClient();
    // Именованный клиент с конфигурацией
    builder.Services.AddHttpClient("GitHub", client =>
    {
        client.BaseAddress = new Uri("https://api.github.com/");
        client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
        client.Timeout = TimeSpan.FromSeconds(15);
    });
  2. Использование в сервисе:

    public class DataService : IDataService
    {
        private readonly HttpClient _httpClient;
        // Инжектируем фабрику
        public DataService(IHttpClientFactory httpClientFactory)
        {
            // Создаем клиент. Его не нужно диспозить.
            _httpClient = httpClientFactory.CreateClient("GitHub");
        }
    
        public async Task<User> GetUserAsync(string username)
        {
            var response = await _httpClient.GetAsync($"users/{username}");
            response.EnsureSuccessStatusCode();
            var json = await response.Content.ReadAsStringAsync();
            return JsonSerializer.Deserialize<User>(json);
        }
    }

Дополнительные практики:

  • Использование Polly через AddHttpClient для реализации политик повторных попыток и обработки сбоев.
  • Всегда использовать асинхронные методы (GetAsync, PostAsync).
  • Валидация и обработка ответов (проверка IsSuccessStatusCode или вызов EnsureSuccessStatusCode()).