Buduję bibliotekę klas do interakcji z interfejsem API. Muszę wywołać interfejs API i przetworzyć odpowiedź XML. Widzę zalety korzystania HttpClient
z łączności asynchronicznej, ale to, co robię, jest czysto synchroniczne, więc nie widzę żadnej znaczącej korzyści z używania HttpWebRequest
.
Jeśli ktoś mógłby rzucić jakiekolwiek światło, byłbym bardzo wdzięczny. Nie jestem zwolennikiem korzystania z nowych technologii ze względu na to.
c#
asp.net
dotnet-httpclient
Keczup
źródło
źródło
Odpowiedzi:
Możesz użyć
HttpClient
do synchronicznych żądań w porządku:Jeśli chodzi dlaczego należy użyć
HttpClient
w ciąguWebRequest
obawia się, dobrze,HttpClient
jest New Kids on the Block i może zawierać ulepszenia w stosunku do starego klienta.źródło
string responseString = Task.Run(() => responseContent.ReadAsStringAsync()).Result;
zamiast jeśli musi uczynić to synchroniczny.Task.Run
wywołuje zadanie z ThreadPool, ale wywołujesz.Result
go, zabijając wszystkie korzyści z tego i blokując wątek, w którym to wywołałeś.Result
(co zwykle jest głównym wątkiem interfejsu użytkownika)..Result
ten sposób może wyczerpać pulę wątków i spowodować impas.new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext()
Powtórzę ponownie odpowiedź Donny V. i Josha
(i głosuj, gdybym miał reputację).
Nie pamiętam, kiedy ostatni raz, jeśli kiedykolwiek, byłem wdzięczny za to, że HttpWebRequest rzucił wyjątki dla kodów statusu> = 400. Aby obejść te problemy, musisz natychmiast wychwycić wyjątki i odwzorować je na niektóre mechanizmy odpowiedzi inne niż wyjątki w twoim kodzie ... sam w sobie nudny, nużący i podatny na błędy. Niezależnie od tego, czy komunikujesz się z bazą danych, czy wdrażasz specjalnie skonfigurowany serwer proxy sieci Web, „prawie” zawsze jest pożądane, aby sterownik Http po prostu powiedział kodowi aplikacji, co zostało zwrócone, i pozostawienie decyzji o tym, jak się zachować.
Dlatego preferowany jest HttpClient.
źródło
HttpClient
sama jest otoczkąHttpWebRequest
(która rzeczywiście łapie teWebException
obiekty i dokonuje konwersjiHttpResponseMessage
na Ciebie). Myślałem, że łatwiej będzie zbudować nowego klienta całkowicie od zera.Jeśli budujesz bibliotekę klas, być może użytkownicy Twojej biblioteki chcieliby korzystać z niej asynchronicznie. Myślę, że to największy powód.
Nie wiesz także, w jaki sposób twoja biblioteka będzie używana. Być może użytkownicy będą przetwarzać wiele żądań, a robienie tego asynchronicznie pomoże mu działać szybciej i wydajniej.
Jeśli możesz to zrobić po prostu, staraj się nie obciążać użytkowników biblioteki, próbując uczynić przepływ asynchronicznym, kiedy możesz się nim zająć.
Jedynym powodem, dla którego nie używałbym wersji asynchronicznej jest to, że próbuję obsługiwać starszą wersję platformy .NET, która nie ma jeszcze wbudowanej obsługi asynchronicznej.
źródło
W moim przypadku zaakceptowana odpowiedź nie zadziałała. Dzwoniłem do API z aplikacji MVC, która nie miała akcji asynchronicznych.
Oto jak udało mi się sprawić, aby działało:
Potem nazwałem to tak:
źródło
Następnie
jeśli użyjesz tej klasy jako parametru, przekażesz metodę asynchroniczną, możesz wywoływać metody asynchroniczne z metod synchronizacji w bezpieczny sposób.
wyjaśniono to tutaj: https://cpratt.co/async-tips-tricks/
źródło
Wydaje się, że wszystkie odpowiedzi koncentrują się na użyciu
HttpClient
synchronicznym zamiast na udzielaniu rzeczywistej odpowiedzi na pytanie.HttpClient
jest czymś więcej niż prostym modułem obsługi zapytań / odpowiedzi, więc może poradzić sobie z pewnymi osobliwościami różnych sieci. Mianowicie w moim przypadku praca z serwerem proxy NTLM, który wymaga negocjacji, wysyłanie wielu żądań / odpowiedzi z tokenami i poświadczeniami między klientem a serwerem proxy w celu uwierzytelnienia.HttpClient
(usingHttpClientHandler
) wydaje się mieć wbudowany mechanizm, który obsługuje jedno kliknięcie metody, które zwraca zasoby poza proxy.źródło