web-dev-qa-db-fra.com

System.Net.Http vs Microsoft.Net.Http

J'utilise ASP.NET Core. Je veux utiliser HttpClient mais j'ai remarqué qu'il y avait deux paquets NuGet offerts. Lequel dois-je utiliser?

74

Dépend de la version. L'ancien System.Net.Http Les packages (les 2. ) sont des packages hérités qui sont déconseillés en faveur de Microsoft.Http.Net selon la description:

Le package hérité, System.Net.Http est maintenant inclus dans le package 'Microsoft.Net.Http'.

Ils existent pour fournir le HttpClient dans les versions précédentes de .NET et les bibliothèques de classes portables. Tu devrais utiliser Microsoft.Net.Http dans ce cas.

Puisque vous utilisez .NET Core, vous devez utiliser le dernier System.Net.Http package (par exemple 4.3.3).

Mis à jour pour csproj

À partir de .NET Standard 2.0, le System.Net.HttpClient Le package est déjà inclus et disponible lorsque vous ciblez netstandard2.0. Si, pour une raison quelconque, vous souhaitez toujours le référencer à la fois pour .NET et .NET Core, vous pouvez ajouter ceci à votre fichier csproj:

<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>

Si vous utilisez project.json

Si votre projet.json cible à la fois les noyaux .NET et .NET Core complets, vous devez ajouter le System.Net.Http Assemblage à l’élément frameworkAssemblies. Par exemple:

"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
    }
  }
}
55
Henk Mollema

Immo Landwerth (responsable de programme sur .NET chez Microsoft) tweeté à propos de ceci:

"HttpClient a commencé comme un paquet NuGet (hors bande) et a également été ajouté au .NET Framework dans la version 4.5 (livré).

Avec .NET Core/.NET Standard, nous avions initialement essayé de modéliser la plate-forme .NET sous la forme d'un ensemble de packages dans lesquels la présence dans la boîte ou hors bande n'avait plus d'importance. Cependant, c'était plus compliqué que prévu.

En conséquence, nous avons largement abandonné l’idée de modéliser la plate-forme .NET en tant que graphe NuGet avec Core/Standard 2.0.

La réponse générale est:

Avec .NET Core 2.0 et .NET Standard 2.0, vous ne devriez plus avoir besoin de faire référence au paquet SystemNetHttpClient NuGet. Il pourrait cependant être extrait de dépendances 1.x.

Il en va de même pour .NET Framework: si vous ciblez la version 4.5 ou supérieure, vous devez généralement utiliser la version intégrée au lieu du package NuGet. Encore une fois, vous pourriez vous retrouver à chercher des dépendances .NET Standard 1.x et PCL, mais le code écrit directement sur .NET Framework ne devrait pas l'utiliser.

Alors pourquoi le paquet existe-t-il toujours/pourquoi le met-on toujours à jour? Tout simplement parce que nous voulons faire fonctionner un code existant qui en a dépendu. Cependant, comme vous l'avez découvert, naviguer sur .NET Framework n'est pas chose aisée.

Le modèle prévu pour le package hérité est le suivant: si vous utilisez le package à partir de .NET Framework 4.5+, .NET Core 2+, .NET Standard 2+, le package est transféré uniquement à l'implémentation fournie par la plate-forme, au lieu d'apporter sa propre version.

Cependant, ce n'est pas ce qui se produit réellement dans tous les cas: le package du client HTTP remplacera (partiellement) les composants intégrés dans .NET Framework qui fonctionneraient pour certains clients et échoueraient pour d'autres. Ainsi, nous ne pouvons pas résoudre facilement le problème maintenant.

En plus de cela, nous avons les problèmes de liaison habituels avec le .NET Framework, donc cela ne fonctionne vraiment bien que si vous ajoutez des redirections de liaison. Yay!

Par conséquent, en tant qu’auteur de bibliothèque, ma recommandation est d’éviter de créer une dépendance à ce paquet et de préférer les versions livrées dans .NET Framework 4.5, .NET Core 2.0 et .NET Standard 2.0. "

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

9
Dan Diplo

Microsoft.Net.Http Nécessite des dépendances supplémentaires Microsoft.Bcl.

Pour cela, si vous êtes uniquement ciblé .NET Framework ou .NET Core, System.Net.Http Est une bonne solution. Sinon, Microsoft.Net.Http Serait un meilleur choix car il pourrait s'agir de la prochaine génération.

6
Youngjae