System.Net.Http so với Microsoft.Net.Http


86

Tôi đang sử dụng ASP.NET Core. Tôi muốn sử dụng HttpClientnhưng tôi nhận thấy rằng có hai gói NuGet đang được cung cấp. Tôi sử dụng cái nào?


Có vẻ như System.Net.Httpphụ thuộc vào Microsoft.Net.Http. Nhưng một lần nữa, nó phụ thuộc vào những gì bạn đang cố gắng thực hiện với ứng dụng của mình.
John Odom

Câu trả lời:


64

Phụ thuộc vào phiên bản. Các System.Net.Httpgói cũ (gói 2.0 ) là các gói kế thừa không được dùng nữa Microsoft.Http.Nettheo mô tả:

Gói kế thừa, System.Net.Http hiện được bao gồm trong gói 'Microsoft.Net.Http'.

Chúng tồn tại để cung cấp các HttpClientphiên bản .NET trước và thư viện Lớp di động. Bạn nên sử dụng Microsoft.Net.Httptrong trường hợp đó.

Vì bạn đang sử dụng .NET Core, bạn nên sử dụng System.Net.Httpgói mới nhất (ví dụ: 4.3.3).

Đã cập nhật cho csproj

Kể từ .NET Standard 2.0, System.Net.HttpClientgói này đã được bao gồm và có sẵn khi bạn nhắm mục tiêu netstandard2.0. Nếu vì lý do nào đó, bạn vẫn muốn tham chiếu nó cho cả .NET và .NET Core đầy đủ, bạn có thể thêm nó vào tệp csproj của mình:

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

Nếu bạn đang sử dụng project.json

Nếu project.json của bạn nhắm mục tiêu cả .NET và .NET Core đầy đủ, bạn phải thêm System.Net.Httpassembly vào frameworkAssembliesphần tử. Ví dụ:

"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
Cần biết rằng chúng không có hành vi giống hệt nhau. Phiên bản .NET đầy đủ (4.0.0.0) không tự động nén, trong khi phiên bản .NET Core (4.1.0) thì có. Vì vậy, nếu bạn sử dụng phiên bản .NET đầy đủ, bạn phải định cấu hình thủ công trình xử lý để sử dụng nén gzip / deflate. Mô tả: github.com/dotnet/docs/issues/1054
Jeppe Andersen

28
Câu trả lời này tóm tắt điều này đã trở nên lộn xộn gì với .NET Core, .NET Standard và .NET Framework.
Vincent

1
@vincent Không có gì khó chịu hơn là đau lưng khi mọi người sử dụng mono, v.v. Đa nền tảng luôn có một số điểm đau.
cuộn

4
Tôi không thấy "Gói kế thừa, System.Net.Httphiện đã được bao gồm trong Microsoft.Net.Httpgói." ngôn ngữ bạn đang đề cập đến trong mô tả gói. Trên thực tế, System.Net.Httpgói này dường như được cập nhật gần đây nhất (trong vài năm)
Dan Esparza

2
@DanEsparza nếu bạn nhìn vào liên kết tôi đã đăng bạn sẽ thấy thông báo. Tôi cũng đã đề cập rằng chỉ các gói (gói 2.0) không được dùng nữa. Các gói 4.xx mới nhất thực sự là mới nhất và bạn nên sử dụng chúng.
Henk Mollema

19

Đối với bất kỳ ai quan tâm đến thông tin cơ bản về vấn đề này, Immo Landwerth (Người quản lý chương trình trên .NET tại Microsoft) đã tweet về điều này:

"HttpClient bắt đầu như một gói NuGet (ngoài băng tần) và cũng được thêm vào .NET Framework trong phiên bản 4.5 (trong hộp).

Với .NET Core / .NET Standard, ban đầu, chúng tôi đã cố gắng tạo mô hình nền tảng .NET dưới dạng một tập hợp các gói mà việc nằm trong hộp so với ngoài băng không còn quan trọng nữa. Tuy nhiên, điều này lộn xộn và phức tạp hơn chúng tôi dự đoán.

Do đó, chúng tôi phần lớn từ bỏ ý tưởng lập mô hình nền tảng .NET dưới dạng đồ thị NuGet với Core / Standard 2.0.

Câu trả lời chung là:

Với .NET Core 2.0 và .NET Standard 2.0, bạn không cần phải tham khảo gói SystemNetHttpClient NuGet. Tuy nhiên, nó có thể được lấy từ các phụ thuộc 1.x.

Tương tự với .NET Framework: nếu bạn nhắm mục tiêu 4.5 trở lên, nói chung bạn nên sử dụng phiên bản trong hộp thay vì gói NuGet. Một lần nữa, bạn có thể kết thúc việc kéo nó vào cho các phụ thuộc .NET Standard 1.x và PCL, nhưng mã được viết trực tiếp dựa trên .NET Framework không nên sử dụng nó.

Vậy tại sao gói vẫn tồn tại / tại sao chúng ta vẫn cập nhật nó? Đơn giản vì chúng tôi muốn làm cho mã hiện có hoạt động mà phụ thuộc vào nó. Tuy nhiên, như bạn đã phát hiện ra rằng điều đó không suôn sẻ trên .NET Framework.

Mô hình dự kiến ​​cho gói kế thừa là: nếu bạn sử dụng gói từ .NET Framework 4.5+, .NET Core 2+, .NET Standard 2+, gói chỉ chuyển tiếp đến nền tảng được cung cấp triển khai thay vì mang phiên bản của riêng nó.

Tuy nhiên, đó không phải là điều thực sự xảy ra trong mọi trường hợp: gói HTTP Client sẽ thay thế (một phần) các thành phần trong hộp trên .NET Framework hoạt động cho một số khách hàng và không hoạt động cho một số khách hàng khác. Do đó, chúng tôi không thể dễ dàng khắc phục sự cố ngay bây giờ.

Trên hết, chúng tôi có các vấn đề ràng buộc thông thường với .NET Framework nên điều này chỉ thực sự hoạt động tốt nếu bạn thêm chuyển hướng ràng buộc. Yay!

Vì vậy, với tư cách là tác giả thư viện, khuyến nghị của tôi là tránh phụ thuộc vào gói này và ưu tiên các phiên bản trong hộp trong .NET Framework 4.5, .NET Core 2.0 và .NET Standard 2.0. "

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


8

Microsoft.Net.Httpyêu cầu Microsoft.Bclphụ thuộc bổ sung .

Đối với điều đó, nếu bạn chỉ nhắm mục tiêu .NET Framework hoặc .NET Core, System.Net.Httpthì rất tốt. Nếu không, Microsoft.Net.Httpsẽ là lựa chọn tốt hơn vì nó có thể là thế hệ tiếp theo.


8
Có vẻ như MS đã thay đổi ý định của họ khi bài đăng này ám chỉ đến ... stackoverflow.com/questions/39016373/… microsoft.net.http đã không được cập nhật từ năm 2015 trong khi system.net.http chỉ là cao lương vài tháng (nuget) .
Smoore 4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.