ASP.NET Coreを使用しています。 HttpClient
を使用したいのですが、2つのNuGetパッケージが提供されていることに気付きました。どちらを使用しますか?
バージョンによって異なります。古い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
}
}
}
この背景についてもっと知りたい人は、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のインボックスバージョンを優先することです。」
Microsoft.Net.Http
には追加のMicrosoft.Bcl
依存関係。
そのため、ターゲットが.NET Frameworkまたは.NET Coreのみの場合、System.Net.Http
はいい。そうでなければ、 Microsoft.Net.Http
は、次世代になる可能性があるため、より良い選択です。