По сабжу. В рамках реста: запрос-ответ. Фоновые воркеры или консольные приложения пока не рассматриваем.
Создаем HttpClient через new: нагружаем ОС, создается риск исчерпания сокетов, обновление DNS нас так же выведет на путь ошибки.
Альтернатива?
Вот чтобы совсем простая - это синглетон, но лучше избегать, как минимум потому, что "синглетон" уже настораживает, а если серьезно для коносольных и воркеров - вполне применимо, но тут надо быть осторожным.
Подход раз.
Для обычного рест-флоу - это IHttpClientFactory. Где основные харктеристики можно задать еще на стадии DI (AddHttpClient):
BaseAddress, DefaultRequestHeaders, DefaultRequestHeaders.Accept, а так же в том числе ретрай политику и многое прочее, а в коде просто вызывать через _httpClientFactory.CreateClient, указав наименование клиента.
Подход два.
Делаем Type Client. Создаем класс. Пробрасываем туда HttpClient и региструем его в DI как HttpClient через те же самые AddHttpClient.
И вуаля: получаете полную инкапсуляцию работы с соединением внутри этого класса. И да, это не синглетон. Это Transient, но по капотом у него те же самые плюшки, что в подходе раз: поведение, пулы.