System.Net.Http vs Microsoft.Net.Http

86

Ich verwende ASP.NET Core. Ich möchte verwenden, habe HttpClientaber festgestellt, dass zwei NuGet-Pakete angeboten werden. Welches benutze ich?

Muhammad Rehan Saeed
quelle
Es sieht so aus, als ob es System.Net.Httpdavon abhängt Microsoft.Net.Http. Andererseits hängt es davon ab, was Sie mit Ihrer Anwendung versuchen.
John Odom

Antworten:

64

Kommt auf die Version an. Die alten System.Net.HttpPakete (die 2.0 ) sind Legacy-Pakete, die Microsoft.Http.Netgemäß der Beschreibung zugunsten von veraltet sind :

Das Legacy-Paket System.Net.Http ist jetzt im Paket 'Microsoft.Net.Http' enthalten.

Sie sind vorhanden, um die HttpClientin früheren .NET-Versionen und Portable Class-Bibliotheken bereitgestellten Bibliotheken bereitzustellen . Sie sollten Microsoft.Net.Httpin diesem Fall verwenden.

Da Sie .NET Core verwenden, sollten Sie das neueste System.Net.HttpPaket verwenden (z. B. 4.3.3).

Aktualisiert für csproj

Ab .NET Standard 2.0 ist das System.Net.HttpClientPaket bereits enthalten und verfügbar, wenn Sie ein Ziel festlegen netstandard2.0. Wenn Sie aus irgendeinem Grund weiterhin auf Full .NET und .NET Core verweisen möchten, können Sie dies zu Ihrer csproj-Datei hinzufügen:

<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <!-- // HttpClient for full .NET -->
    <Reference Include="System.Net.Http" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
    <!-- // HttpClient for .NET Core -->
    <PackageReference Include="System.Net.Http" Version="4.3.3" />
</ItemGroup>

Wenn Sie project.json verwenden

Wenn Ihre project.json sowohl auf .NET als auch auf .NET Core abzielt, müssen Sie die System.Net.HttpAssembly dem frameworkAssembliesElement hinzufügen . Beispielsweise:

"frameworks": {
  "net451": {
    "frameworkAssemblies": {
      "System.Net.Http": "4.0.0.0" // HttpClient for full .NET
    }
  },
  "netstandard1.3": {
    "dependencies": {
      "System.Net.Http": "4.1.0", // HttpClient for .NET Core
    }
  }
}
Henk Mollema
quelle
1
Beachten Sie, dass sie nicht genau das gleiche Verhalten haben. Die vollständige .NET-Version (4.0.0.0) führt keine automatische Komprimierung durch, während die .NET Core-Version (4.1.0) dies tut. Wenn Sie also die vollständige .NET-Version verwenden, müssen Sie den Handler manuell für die Verwendung der gzip / deflate-Komprimierung konfigurieren. Beschreibung: github.com/dotnet/docs/issues/1054
Jeppe Andersen
27
Diese Antwort fasst zusammen, was für ein Durcheinander dies mit .NET Core, .NET Standard und .NET Framework geworden ist.
Vincent
1
@ Vincent Es ist nicht mehr ein Schmerz im Arsch als damals, als Leute Mono usw. verwendeten. Multi-Plattform hat immer einige Schmerzpunkte.
rollt
4
Ich sehe das "Legacy-Paket, System.Net.Httpdas jetzt im Microsoft.Net.HttpPaket enthalten ist" nicht. Sprache, auf die Sie sich in der Paketbeschreibung beziehen. Tatsächlich System.Net.Httpscheint das Paket zuletzt (um einige Jahre) aktualisiert worden zu sein
Dan Esparza
2
@DanEsparza Wenn Sie sich den Link ansehen, den ich gepostet habe, sehen Sie die Nachricht. Ich erwähnte auch, dass nur die alten Pakete (die 2.0) veraltet sind. Die neuesten 4.xx-Pakete sind in der Tat die neuesten und Sie sollten sie verwenden.
Henk Mollema
19

Für alle, die mehr Hintergrundinformationen benötigen , hat Immo Landwerth (Programmmanager bei .NET bei Microsoft) darüber getwittert :

"HttpClient begann als NuGet-Paket (Out-of-Band) und wurde auch in 4.5 (Posteingang) zum .NET Framework hinzugefügt.

Mit .NET Core / .NET Standard haben wir ursprünglich versucht, die .NET-Plattform als eine Reihe von Paketen zu modellieren, bei denen es nicht mehr darauf ankam, Posteingang oder Out-of-Band zu sein. Dies war jedoch chaotischer und komplizierter als wir erwartet hatten.

Infolgedessen haben wir die Idee, die .NET-Plattform als NuGet-Diagramm mit Core / Standard 2.0 zu modellieren, weitgehend aufgegeben.

Die allgemeine Antwort lautet:

Mit .NET Core 2.0 und .NET Standard 2.0 sollten Sie überhaupt nicht auf das SystemNetHttpClient NuGet-Paket verweisen müssen. Es könnte jedoch aus 1.x-Abhängigkeiten gezogen werden.

Gleiches gilt für .NET Framework: Wenn Sie auf 4.5 und höher abzielen, sollten Sie im Allgemeinen die In-Box-Version anstelle des NuGet-Pakets verwenden. Auch hier kann es vorkommen, dass Sie es für .NET Standard 1.x- und PCL-Abhängigkeiten verwenden, aber Code, der direkt für .NET Framework geschrieben wurde, sollte es nicht verwenden.

Warum existiert das Paket noch / warum aktualisieren wir es noch? Einfach, weil wir vorhandenen Code funktionsfähig machen wollen, der davon abhängig ist. Wie Sie jedoch festgestellt haben, ist das Segeln in .NET Framework nicht reibungslos.

Das beabsichtigte Modell für das Legacy-Paket lautet: Wenn Sie das Paket aus .NET Framework 4.5+, .NET Core 2+, .NET Standard 2+ verwenden, wird das Paket nur an die von der Plattform bereitgestellte Implementierung weitergeleitet, anstatt eine eigene Version zu bringen.

Dies ist jedoch nicht in allen Fällen der Fall: Das HTTP-Client-Paket ersetzt (teilweise) Posteingangskomponenten in .NET Framework, die für einige Kunden funktionieren und für andere fehlschlagen. Daher können wir das Problem jetzt nicht einfach beheben.

Darüber hinaus haben wir die üblichen Bindungsprobleme mit .NET Framework, sodass dies nur dann wirklich gut funktioniert, wenn Sie Bindungsumleitungen hinzufügen. Yay!

Als Bibliotheksautor empfehle ich daher, eine Abhängigkeit von diesem Paket zu vermeiden und die In-Box-Versionen in .NET Framework 4.5, .NET Core 2.0 und .NET Standard 2.0 zu bevorzugen. "

https://twitter.com/terrajobst/status/997262020108926976

Dan Diplo
quelle
8

Microsoft.Net.Httperfordert zusätzliche Microsoft.BclAbhängigkeiten.

Wenn Sie nur auf .NET Framework oder .NET Core abzielen, System.Net.Httpist dies eine gute Wahl. Andernfalls Microsoft.Net.Httpwäre die bessere Wahl, da es die nächste Generation sein könnte.

Youngjae
quelle
8
MS scheint seine Meinung geändert zu haben, da dieser Beitrag auf ... stackoverflow.com/questions/39016373/… microsoft.net.http wurde seit 2015 nicht aktualisiert, während system.net.http nur ein paar Monate Sago (nuget) ist. .
smoore4
Wenn ich für Xamarin entwickle, welches sollte ich besser verwenden? Ihr Vorschlag wird geschätzt.
Pablo Gonzalez