Я строю библиотеку классов для взаимодействия с API. Мне нужно вызвать API и обработать ответ XML. Я вижу преимущества использования HttpClient
асинхронного подключения, но то, что я делаю, чисто синхронно, поэтому я не вижу каких-либо существенных преимуществ по сравнению с использованием HttpWebRequest
.
Если кто-то может пролить свет, я был бы очень признателен. Я не из тех, кто использует новые технологии ради этого.
c#
asp.net
dotnet-httpclient
Кетчуп
источник
источник
Ответы:
Вы можете использовать
HttpClient
для синхронных запросов просто отлично:Что касается того, почему вы должны использовать
HttpClient
overWebRequest
, тоHttpClient
это новый ребенок в блоке, который может содержать улучшения по сравнению со старым клиентом.источник
string responseString = Task.Run(() => responseContent.ReadAsStringAsync()).Result;
вместо этого , если вы должны сделать это синхронным.Task.Run
вызывает задачу из ThreadPool, но вы вызываете.Result
ее, убивая все выгоды от этого и блокируя поток, в котором вы вызвали это.Result
(который обычно бывает основным потоком пользовательского интерфейса)..Result
подобные вызовы могут исчерпать пул потоков и вызвать взаимоблокировку.new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext()
Я бы повторил ответ Донни В. и Джоша
(и upvote, если у меня была репутация.)
Я не могу вспомнить последний раз, если когда-либо, я был благодарен за тот факт, что HttpWebRequest выдал исключения для кодов состояния> = 400. Чтобы обойти эти проблемы, вам нужно немедленно перехватить исключения и сопоставить их с некоторыми механизмами реагирования на исключения. в вашем коде ... скучно, утомительно и подвержено ошибкам само по себе. Будь то связь с базой данных или реализация сделанного на заказ веб-прокси, «почти» всегда желательно, чтобы драйвер Http просто сообщал вашему коду приложения, что было возвращено, и оставлял вам решать, как себя вести.
Следовательно, HttpClient предпочтительнее.
источник
HttpClient
сам по себе является оберткойHttpWebRequest
(которая действительно внутренне ловит этиWebException
объекты и выполняет преобразование в aHttpResponseMessage
для вас). Я бы подумал, что будет проще построить новый клиент с нуля.Если вы создаете библиотеку классов, то, возможно, пользователи вашей библиотеки захотят использовать вашу библиотеку асинхронно. Я думаю, что это самая главная причина прямо здесь.
Вы также не знаете, как будет использоваться ваша библиотека. Возможно, пользователи будут обрабатывать много-много запросов, и асинхронное выполнение этого поможет быстрее и эффективнее.
Если вы можете сделать это просто, постарайтесь не возлагать бремя на пользователей вашей библиотеки, пытаясь сделать поток асинхронным, когда вы можете позаботиться об этом за них.
Единственная причина, по которой я бы не использовал асинхронную версию, заключается в том, что я пытался поддерживать более старую версию .NET, которая еще не имеет встроенной поддержки асинхронности.
источник
В моем случае принятый ответ не сработал. Я вызывал API из приложения MVC, у которого не было асинхронных действий.
Вот как мне удалось заставить его работать:
Тогда я назвал это так:
источник
затем
если вы используете этот класс, передайте свой асинхронный метод в качестве параметра, вы можете безопасно вызывать асинхронные методы из методов синхронизации.
это объясняется здесь: https://cpratt.co/async-tips-tricks/
источник
Все ответы, кажется, сосредоточены на использовании
HttpClient
синхронно, вместо того, чтобы давать фактический ответ на вопрос.HttpClient
это больше, чем простой обработчик запросов / ответов, поэтому он может иметь дело с некоторыми особенностями различных сетей. А именно, в моем случае, работа с прокси-сервером NTLM, который требует согласования, отправки нескольких запросов / ответов с токенами и учетными данными между клиентом и прокси-сервером для аутентификации.HttpClient
(ИспользованиеHttpClientHandler
), кажется, имеет встроенный механизм, который обрабатывает, который возвращает ресурсы за прокси с помощью одного вызова метода.источник