ASP.NETCoreを使用しています。使用したいのですHttpClient
が、2つのNuGetパッケージが提供されていることに気付きました。どちらを使用しますか?
ASP.NETCoreを使用しています。使用したいのですHttpClient
が、2つのNuGetパッケージが提供されていることに気付きました。どちらを使用しますか?
回答:
バージョンによって異なります。古いSystem.Net.Http
パッケージ(2.0のもの)はMicrosoft.Http.Net
、説明に従って非推奨となったレガシーパッケージです。
レガシーパッケージのSystem.Net.Httpは、「Microsoft.Net.Http」パッケージに含まれるようになりました。
これらはHttpClient
、以前の.NETバージョンおよびポータブルクラスライブラリを提供するために存在します。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と.NETCoreの両方を対象としている場合は、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
}
}
}
System.Net.Http
含まれていMicrosoft.Net.Http
ます」が表示されません。パッケージの説明で参照している言語。実際、System.Net.Http
パッケージは最近(数年までに)更新されたようです
これに関するより多くの背景に興味がある人のために、Immo Landwerth(Microsoftの.NETのプログラムマネージャー)はこれについてツイートしました:
「HttpClientはNuGetパッケージ(アウトオブバンド)として開始され、4.5でも.NET Frameworkに追加されました(インボックス)。
.NET Core / .NET Standardを使用して、当初は.NETプラットフォームをパッケージのセットとしてモデル化しようとしましたが、インボックスかアウトオブバンドかは問題ではなくなりました。しかし、これは私たちが予想していたよりも厄介で複雑でした。
その結果、.NETプラットフォームをCore / Standard2.0を使用してNuGetグラフとしてモデル化するというアイデアを大幅に放棄しました。
一般的な答えは次のとおりです。
.NET Core2.0および.NETStandard 2.0では、SystemNetHttpClientNuGetパッケージを参照する必要はまったくありません。ただし、1.xの依存関係からプルされる可能性があります。
.NET Frameworkについても同じことが言えます。4.5以降を対象とする場合は、通常、NuGetパッケージではなくインボックスバージョンを使用する必要があります。繰り返しになりますが、.NET Standard 1.xおよびPCLの依存関係のためにそれをプルすることになるかもしれませんが、.NETFrameworkに対して直接記述されたコードはそれを使用すべきではありません。
では、なぜパッケージがまだ存在するのですか/なぜまだ更新するのですか?依存関係のある既存のコードを機能させたいという理由だけで。ただし、ご存知のとおり、.NETFrameworkでの航海はスムーズではありません。
レガシーパッケージの対象モデルは次のとおりです。.NETFramework4.5+ 、. NET Core 2 + 、. NET Standard 2+からパッケージを使用する場合、パッケージは、独自のバージョンを提供するのではなく、プラットフォームが提供する実装にのみ転送されます。
ただし、これはすべての場合に実際に発生するわけではありません。HTTPクライアントパッケージは、一部の顧客では機能し、他の顧客では失敗する.NETFrameworkの受信トレイコンポーネントを(部分的に)置き換えます。したがって、現在、問題を簡単に修正することはできません。
その上、.NET Frameworkには通常のバインディングの問題があるため、これはバインディングリダイレクトを追加した場合にのみ実際にうまく機能します。わーい!
したがって、ライブラリの作成者として、このパッケージに依存することを避け、.NET Framework 4.5、.NET Core 2.0、および.NET Standard2.0のインボックスバージョンを優先することをお勧めします。」
Microsoft.Net.Http
追加のMicrosoft.Bcl
依存関係が必要です。
そのため、.NETFrameworkまたは.NETCoreのみを対象としている場合は、それでSystem.Net.Http
十分です。そうでなければ、それはMicrosoft.Net.Http
次世代になる可能性があるので、より良い選択でしょう。
System.Net.Http
依存してMicrosoft.Net.Http
いるようです。しかし、繰り返しになりますが、それはアプリケーションで何をしようとしているかによって異なります。