Ich baue eine Klassenbibliothek auf, um mit einer API zu interagieren. Ich muss die API aufrufen und die XML-Antwort verarbeiten. Ich kann die Vorteile der Verwendung HttpClient
für die asynchrone Konnektivität erkennen, aber was ich tue, ist rein synchron, sodass ich keinen signifikanten Vorteil gegenüber der Verwendung sehe HttpWebRequest
.
Wenn jemand Licht ins Dunkel bringen kann, würde ich es sehr schätzen. Ich bin nicht einer, der dafür neue Technologien einsetzt.
c#
asp.net
dotnet-httpclient
Ketchup
quelle
quelle
Antworten:
Sie können
HttpClient
für synchrone Anfragen ganz gut verwenden:Was den Grund betrifft, warum Sie
HttpClient
over verwenden solltenWebRequest
,HttpClient
ist das neue Kind auf dem Block und könnte Verbesserungen gegenüber dem alten Client enthalten.quelle
string responseString = Task.Run(() => responseContent.ReadAsStringAsync()).Result;
statt , wenn Sie müssen diese synchron machen.Task.Run
ruft die Aufgabe von einem ThreadPool aus auf, aber Sie rufen sie.Result
auf, um alle Vorteile daraus zu ziehen und den Thread zu blockieren, in dem Sie dies aufgerufen haben.Result
(was normalerweise der Haupt-UI-Thread ist)..Result
kann ein solcher Aufruf den Threadpool erschöpfen und einen Deadlock verursachen.new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext()
Ich würde die Antwort von Donny V. und Josh wiederholen
(und positiv, wenn ich den Ruf hatte.)
Ich kann mich nicht an das letzte Mal erinnern, wenn überhaupt, war ich dankbar dafür, dass HttpWebRequest Ausnahmen für Statuscodes> = 400 ausgelöst hat. Um diese Probleme zu umgehen, müssen Sie die Ausnahmen sofort abfangen und sie einigen Nicht-Ausnahme-Antwortmechanismen zuordnen in Ihrem Code ... langweilig, langweilig und fehleranfällig an sich. Unabhängig davon, ob Sie mit einer Datenbank kommunizieren oder einen maßgeschneiderten Webproxy implementieren, ist es „fast“ immer wünschenswert, dass der HTTP-Treiber Ihrem Anwendungscode nur mitteilt, was zurückgegeben wurde, und es Ihnen überlässt, zu entscheiden, wie Sie sich verhalten.
Daher ist HttpClient vorzuziehen.
quelle
HttpClient
sich um einen Wrapper handeltHttpWebRequest
(der dieseWebException
Objekte tatsächlich intern erfasst und die Konvertierung in aHttpResponseMessage
für Sie vornimmt). Ich hätte gedacht, es wäre einfacher, einen neuen Client komplett von Grund auf neu zu erstellen.Wenn Sie eine Klassenbibliothek erstellen, möchten die Benutzer Ihrer Bibliothek Ihre Bibliothek möglicherweise asynchron verwenden. Ich denke, das ist genau dort der größte Grund.
Sie wissen auch nicht, wie Ihre Bibliothek verwendet werden soll. Vielleicht werden die Benutzer viele, viele Anfragen bearbeiten, und wenn Sie dies asynchron tun, können Sie schneller und effizienter arbeiten.
Wenn Sie dies einfach tun können, versuchen Sie, die Benutzer Ihrer Bibliothek nicht zu belasten, indem Sie versuchen, den Ablauf asynchron zu gestalten, wenn Sie sich um sie kümmern können.
Der einzige Grund, warum ich die asynchrone Version nicht verwenden würde, ist, wenn ich versuchen würde, eine ältere Version von .NET zu unterstützen, die noch keine integrierte asynchrone Unterstützung bietet.
quelle
In meinem Fall hat die akzeptierte Antwort nicht funktioniert. Ich habe die API von einer MVC-Anwendung aufgerufen, die keine asynchronen Aktionen hatte.
So habe ich es geschafft:
Dann habe ich es so genannt:
quelle
Dann
Wenn Sie diese Klasse verwenden und Ihre asynchrone Methode als Parameter übergeben, können Sie die asynchronen Methoden auf sichere Weise aus den Synchronisierungsmethoden aufrufen.
Es wird hier erklärt: https://cpratt.co/async-tips-tricks/
quelle
Alle Antworten scheinen sich auf die
HttpClient
synchrone Verwendung zu konzentrieren, anstatt die Frage tatsächlich zu beantworten.HttpClient
ist mehr als ein einfacher Anforderungs- / Antwort-Handler, mit dem einige Besonderheiten verschiedener Netzwerke behandelt werden können. In meinem Fall nämlich mit einem NTLM-Proxy arbeiten, für den eine Verhandlung erforderlich ist, und mehrere Anfragen / Antworten mit Token und Anmeldeinformationen zwischen Client und Proxyserver zur Authentifizierung senden.HttpClient
(usingHttpClientHandler
) scheint einen eingebauten Mechanismus zu haben, der mit einem Methodenaufruf Ressourcen jenseits des Proxys zurückgibt.quelle