System.Net.HttpとMicrosoft.Net.Http


86

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


System.Net.Http依存してMicrosoft.Net.Httpいるようです。しかし、繰り返しになりますが、それはアプリケーションで何をしようとしているかによって異なります。
ジョン・オドム

回答:


64

バージョンによって異なります。古い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
    }
  }
}

1
それらはまったく同じ動作をしないことに注意してください。完全な.NETバージョン(4.0.0.0)は自動圧縮を行いませんが、.NET Coreバージョン(4.1.0)は自動圧縮を行います。したがって、完全な.NETバージョンを使用する場合は、gzip / deflate圧縮を使用するようにハンドラーを手動で構成する必要があります。説明:github.com/dotnet/docs/issues/1054
Jeppe Andersen

28
この回答は、これが.NET Core、.NET Standard、および.NETFrameworkでどのように混乱したかをまとめたものです。
ヴィンセント

1
@vincent人々がモノラルなどを使用したとき、それは背中よりもお尻の痛みではありません。マルチプラットフォームには常にいくつかの問題点があります。
2017

4
「レガシーパッケージがパッケージにSystem.Net.Http含まれていMicrosoft.Net.Httpます」が表示されません。パッケージの説明で参照している言語。実際、System.Net.Httpパッケージは最近(数年までに)更新されたようです
Dan Esparza 2018年

2
@DanEsparza私が投稿たリンクを見ると、メッセージが表示されます。また、古いパッケージ(2.0パッケージ)のみが非推奨になることにも触れました。最新の4.xxパッケージは確かに最新であり、それらを使用する必要があります。
ヘンクMollema

19

これに関するより多くの背景に興味がある人のために、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のインボックスバージョンを優先することをお勧めします。」

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


8

Microsoft.Net.Http追加のMicrosoft.Bcl依存関係が必要です。

そのため、.NETFrameworkまたは.NETCoreのみを対象としている場合は、それでSystem.Net.Http十分です。そうでなければ、それはMicrosoft.Net.Http次世代になる可能性があるので、より良い選択でしょう。


8
この投稿がほのめかしているように、MSは考えを変えたようです... stackoverflow.com/questions/39016373/…microsoft.net.http は2015年以降更新されていませんが、system.net.httpはほんの数か月前です(nuget) 。
smoore4 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.