web-dev-qa-db-ja.com

System.Net.HttpとMicrosoft.Net.Http

ASP.NET Coreを使用しています。 HttpClientを使用したいのですが、2つのNuGetパッケージが提供されていることに気付きました。どちらを使用しますか?

74

バージョンによって異なります。古いSystem.Net.Httpパッケージ( 2. ones)は、説明に従って Microsoft.Http.Net を優先して廃止されたレガシーパッケージです。

レガシーパッケージであるSystem.Net.Httpが「Microsoft.Net.Http」パッケージに含まれるようになりました。

以前の.NETバージョンとポータブルクラスライブラリでHttpClientを提供するために存在します。その場合は、Microsoft.Net.Httpを使用する必要があります。

.NET Coreを使用しているため、最新の System.Net.Http パッケージ(4.3.3など)を使用する必要があります。

csprojの更新

.NET Standard 2.0の時点で、System.Net.HttpClientパッケージはすでに含まれており、netstandard2.0をターゲットにすると利用可能になります。何らかの理由で完全な.NETと.NET Coreの両方で参照したい場合は、これを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>

project.jsonを使用している場合

Project.jsonが完全な.NETと.NET Coreの両方を対象とする場合、System.Net.HttpアセンブリをframeworkAssemblies要素に追加する必要があります。例えば:

"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(Microsoftの.NETのプログラムマネージャー) tweeted について:

「HttpClientはNuGetパッケージ(帯域外)として始まり、4.5でも.NET Frameworkに追加されました(インボックス)。

.NET Core/.NET Standardでは、当初、.NETプラットフォームをインボックスとアウトオブバンドのどちらでも問題のないパッケージのセットとしてモデル化しようとしました。ただし、これは予想以上に複雑で複雑でした。

その結果、.NETプラットフォームをCore/Standard 2.0を使用したNuGetグラフとしてモデル化するという考えをほとんど放棄しました。

一般的な答えは次のとおりです。

.NET Core 2.0および.NET Standard 2.0では、SystemNetHttpClient NuGetパッケージを参照する必要はまったくありません。ただし、1.xの依存関係からプルされる可能性があります。

.NET Frameworkについても同じことが言えます。4.5以降を対象とする場合は、通常、NuGetパッケージの代わりにインボックスバージョンを使用する必要があります。繰り返しになりますが、.NET Standard 1.xおよびPCLの依存関係のためにそれを取り込むことになりますが、.NET Frameworkに対して直接記述されたコードはそれを使用すべきではありません。

では、なぜパッケージがまだ存在するのか、なぜ更新するのか?単に、依存している既存のコードを機能させたいからです。ただし、あなたが発見したように、それは.NET Frameworkでのスムーズな航行ではありません。

レガシーパッケージの対象モデル:.NET Framework 4.5 + 、. NET Core 2 + 、. NET Standard 2+からパッケージを使用する場合、パッケージは独自のバージョンではなく、プラットフォームが提供する実装にのみ転送されます。

ただし、すべての場合に実際に発生するわけではありません。HTTPクライアントパッケージは、.NET Frameworkのインボックスコンポーネントを(部分的に)置き換えます。したがって、現在、この問題を簡単に修正することはできません。

さらに、.NET Frameworkには通常のバインディングの問題があるため、バインディングリダイレクトを追加する場合にのみ、これは本当にうまく機能します。わーい!

したがって、ライブラリ作成者としての私の推奨事項は、このパッケージへの依存を避け、.NET Framework 4.5、.NET Core 2.0、および.NET Standard 2.0のインボックスバージョンを優先することです。」

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

9
Dan Diplo

Microsoft.Net.Httpには追加のMicrosoft.Bcl依存関係。

そのため、ターゲットが.NET Frameworkまたは.NET Coreのみの場合、System.Net.Httpはいい。そうでなければ、 Microsoft.Net.Httpは、次世代になる可能性があるため、より良い選択です。

6
Youngjae