Какова цель HttpClient.BaseAddress и почему я не могу ее изменить после первого запроса

Это применение закона Postel's, «быть консервативным в том, что вы делаете, быть либеральным в том, что вы принимаете от других».

Проверки равенства могут выполняться независимо от типа ; метод equals определен в классе Object и принимает любой параметр Object в качестве параметра. Таким образом, имеет смысл эквивалентность ключей и операции, основанные на эквивалентности ключей, для принятия любого типа Object.

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

0
задан Jerome Reinländer 13 July 2018 в 07:23
поделиться

2 ответа

Для (1) общим вариантом использования будет клиент, который взаимодействует с одним сервером. Возможно, это интерфейс API, который был создан для использования этим клиентом. Точные данные будут храниться в файле конфигурации, который клиент читает во время запуска.

Мы могли бы заманить наш код прямым доступом к конфигу или ввести строку, считанную из config, в каждое место, которое необходимо построить полный URL. Или мы могли бы просто сконфигурировать BaseAddress HttpClient, который мы помещаем в наш контейнер Injection Dependency, и просто позволить местам потребления иметь этот объект. Это для меня несколько ожидаемый прецедент.

Для (2) я не думаю, что существует техническое ограничение. Я думаю, что это больше для спасения людей от самих себя. Поскольку установка BaseAddress и выполнение фактического запроса для выхода через, например, GetAsync являются отдельными действиями, было бы небезопасно, чтобы два отдельных фрагмента кода делали такую ​​вещь одновременно - вы могли легко получить гонки. Поэтому легче рассуждать о многопоточных программах, которые могут совместно использовать один экземпляр HttpClient, если такие расы не разрешены в первую очередь.

2
ответ дан Damien_The_Unbeliever 17 August 2018 в 13:27
поделиться
  • 1
    Это, безусловно, хороший ответ и подчеркивает аспекты, о которых я даже не думал. Я соглашусь с этим, если никто не сможет придумать лучшее (т. Е. Техническое) объяснение. – Jerome Reinländer 13 July 2018 в 08:30
  • 2
    Согласно вашему ответу, в ситуации, когда у вас много запросов на несколько базовых адресов (т. Е. 5), было бы целесообразно иметь 5 экземпляров HttpClient с BaseAddress вместо одного для всех запросов? – Jerome Reinländer 13 July 2018 в 08:42
  • 3
    @ JeromeReinländer - если они все примерно равны «вес», это, наверное, то, что я сделал бы. Итак, у нас есть настройка, где у нас есть «Клиент». REST, "Примечания" REST и "Коллега" Служба REST. Каждая служба включает множество богатых внутренних ссылок в своих ответах, и все они являются относительными, а не абсолютными URL-адресами. Таким образом, клиенту, потребляющему все эти сервисы, будут предоставлены 3 экземпляра HttpClient, настроенные с базовыми адресами для соответствующей комбинации среды / службы и могут легко взаимодействовать с каждой услугой по мере необходимости. – Damien_The_Unbeliever 13 July 2018 в 08:46

2 цели:

  1. Удобство. Если вы вызываете множество конечных точек с одного хоста, и вы управляете сегментами базового адреса и конечной точки в виде отдельных строк (очень часто), это помогает избежать выполнения уродливой конкатенации строк при каждом вызове.
  2. Поощрение лучших практик. Хотя выполнение вызовов через GetAsync и т. Д. Является потокобезопасным, HttpClient имеет несколько свойств в дополнение к BaseAddress, например DefaultRequestHeaders, которые не являются. Как правило, вы хотите, чтобы они были одинаковыми для вызовов одного и того же хоста, но не для вызовов на разные. По этой причине экземпляр HttpClient на вызываемый хост фактически является очень хорошей практикой. Если вы не вызываете тысячи разных хостов, вам не нужно беспокоиться о проблемах, связанных с нарушением надзора . (И даже если бы вы использовали одноэлементный режим, базовому сетевому стеку в любом случае нужно было бы открыть другой сокет на хост.)

Итак, почему нужно указать полный адрес при вызове HttpClient даже работать вообще? Опять же, удобство. Адрес может исходить от внешнего источника или ввода пользователя, и вы не захотите его разбивать на части, чтобы использовать его. Но в этом случае вы находитесь на крюке для обеспечения безопасности потоков, и те, которые не являются потокобезопасными свойствами, вероятно, просто должны быть полностью исключены.

1
ответ дан Todd Menier 17 August 2018 в 13:27
поделиться