System.Net.Http vs Microsoft.Net.Http

86

Saya menggunakan ASP.NET Core. Saya ingin menggunakan HttpClienttapi saya perhatikan ada dua paket NuGet yang ditawarkan. Yang mana yang saya gunakan?

Muhammad Rehan Saeed
sumber
Sepertinya System.Net.Httptergantung Microsoft.Net.Http. Tapi sekali lagi, itu tergantung pada apa yang Anda coba lakukan dengan aplikasi Anda.
John Odom

Jawaban:

65

Tergantung versinya. Paket- System.Net.Httppaket lama (yang 2.0 ) adalah paket lama yang tidak digunakan lagi Microsoft.Http.Netsesuai dengan deskripsi:

Paket lawas, System.Net.Http sekarang disertakan dalam paket 'Microsoft.Net.Http'.

Mereka ada untuk menyediakan HttpClientdi versi .NET sebelumnya dan perpustakaan Kelas Portabel. Anda harus menggunakan Microsoft.Net.Httpdalam kasus itu.

Karena Anda menggunakan .NET Core, Anda harus menggunakan System.Net.Httppaket terbaru (mis. 4.3.3).

Diperbarui untuk csproj

Mulai .NET Standard 2.0, System.Net.HttpClientpaket sudah disertakan dan tersedia saat Anda menargetkan netstandard2.0. Jika, karena alasan tertentu, Anda masih ingin mereferensikannya untuk .NET penuh dan .NET Core, Anda dapat menambahkan ini ke file csproj Anda:

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

Jika Anda menggunakan project.json

Jika project.json Anda menargetkan penuh .NET dan .NET Core, Anda harus menambahkan System.Net.Httprakitan ke frameworkAssemblieselemen. Sebagai contoh:

"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
    }
  }
}
Henk Mollema
sumber
1
Ketahuilah bahwa mereka tidak memiliki perilaku yang sama persis. Versi .NET lengkap (4.0.0.0) tidak melakukan kompresi otomatis, sedangkan versi .NET Core (4.1.0) melakukannya. Jadi, jika Anda menggunakan versi .NET lengkap, Anda harus mengkonfigurasi penangan secara manual untuk menggunakan kompresi gzip / deflate. Deskripsi: github.com/dotnet/docs/issues/1054
Jeppe Andersen
28
Jawaban ini menyimpulkan betapa kacau hal ini dengan .NET Core, .NET Standard, dan .NET Framework.
Vincent
1
@vincent Tidak lebih menyebalkan daripada punggung ketika orang menggunakan mono dll. Multi platform selalu memiliki beberapa poin rasa sakit.
memutar
4
Saya tidak melihat "Paket lama, System.Net.Httpsekarang disertakan dalam Microsoft.Net.Httppaket." bahasa yang Anda maksud di deskripsi paket. Faktanya, System.Net.Httppaket tersebut tampaknya paling baru diperbarui (beberapa tahun)
Dan Esparza
2
@DanEsparza jika Anda melihat tautan yang saya posting, Anda akan melihat pesan. Saya juga menyebutkan bahwa hanya paket lama (yang 2.0) yang tidak digunakan lagi. Paket 4.xx terbaru memang yang terbaru dan Anda harus menggunakannya.
Henk Mollema
19

Bagi siapa pun yang tertarik dengan latar belakang lebih lanjut tentang ini, Immo Landwerth (Manajer program di .NET di Microsoft) tweet tentang ini:

"HttpClient dimulai sebagai paket NuGet (out-of-band) dan ditambahkan ke .NET Framework 4.5 juga (in-box).

Dengan .NET Core / .NET Standard kami awalnya mencoba untuk memodelkan platform .NET sebagai satu set paket di mana in-box vs. out-of-band tidak lagi penting. Namun, ini lebih berantakan dan lebih rumit dari yang kami perkirakan.

Akibatnya, kami mengabaikan sebagian besar ide pemodelan platform .NET sebagai grafik NuGet dengan Core / Standard 2.0.

Jawaban umumnya adalah:

Dengan .NET Core 2.0 dan .NET Standard 2.0 Anda tidak perlu mereferensikan paket SystemNetHttpClient NuGet sama sekali. Ini mungkin ditarik dari dependensi 1.x.

Hal yang sama berlaku untuk .NET Framework: jika Anda menargetkan 4.5 dan yang lebih baru, Anda biasanya harus menggunakan versi dalam kotak daripada paket NuGet. Sekali lagi, Anda mungkin akan menariknya untuk dependensi .NET Standard 1.x dan PCL, tetapi kode yang ditulis langsung terhadap .NET Framework tidak boleh menggunakannya.

Jadi kenapa paketnya masih ada / kenapa kita masih update? Hanya karena kami ingin membuat kode yang ada berfungsi yang membutuhkan ketergantungan padanya. Namun, karena Anda menemukan itu tidak lancar di .NET Framework.

Model yang dimaksudkan untuk paket lawas adalah: jika Anda menggunakan paket dari .NET Framework 4.5+, .NET Core 2+, .NET Standard 2+ paket hanya meneruskan ke platform yang disediakan implementasi sebagai lawan membawa versinya sendiri.

Bukan itu yang sebenarnya terjadi dalam semua kasus: paket Klien HTTP akan (sebagian) menggantikan komponen dalam kotak pada .NET Framework yang kebetulan berfungsi untuk beberapa pelanggan dan gagal untuk yang lain. Karenanya, kami tidak dapat dengan mudah memperbaiki masalah tersebut sekarang.

Selain itu, kami memiliki masalah pengikatan yang biasa dengan .NET Framework jadi ini hanya benar-benar berfungsi dengan baik jika Anda menambahkan pengalihan pengikatan. Yay!

Jadi, sebagai penulis perpustakaan, rekomendasi saya adalah menghindari ketergantungan pada paket ini dan lebih memilih versi dalam kotak di .NETFramework 4.5, .NETCore 2.0, dan .NETStandar 2.0. "

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

Dan Diplo
sumber
8

Microsoft.Net.Httpmembutuhkan Microsoft.Bclketergantungan tambahan .

Untuk itu, jika Anda hanya menargetkan .NET Framework atau .NET Core, System.Net.Httpada baiknya. Jika tidak, Microsoft.Net.Httpakan menjadi pilihan yang lebih baik karena bisa menjadi generasi berikutnya.

Youngjae
sumber
8
Tampaknya MS telah berubah pikiran karena posting ini menyinggung ... stackoverflow.com/questions/39016373/… microsoft.net.http belum diperbarui sejak 2015 sementara system.net.http hanya beberapa bulan sagu (nuget) .
smoore4