Tôi đang sử dụng ASP.NET Core. Tôi muốn sử dụng HttpClient
như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?
Tôi đang sử dụng ASP.NET Core. Tôi muốn sử dụng HttpClient
như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âu trả lời:
Phụ thuộc vào phiên bản. Các System.Net.Http
gói cũ (gói 2.0 ) là các gói kế thừa không được dùng nữa Microsoft.Http.Net
theo 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 HttpClient
phiên bản .NET trước và thư viện Lớp di động. Bạn nên sử dụng Microsoft.Net.Http
trong trường hợp đó.
Vì bạn đang sử dụng .NET Core, bạn nên sử dụng System.Net.Http
gói mới nhất (ví dụ: 4.3.3).
Đã cập nhật cho csproj
Kể từ .NET Standard 2.0, System.Net.HttpClient
gó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.Http
assembly vào frameworkAssemblies
phầ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
}
}
}
System.Net.Http
hiện đã được bao gồm trong Microsoft.Net.Http
gói." ngôn ngữ bạn đang đề cập đến trong mô tả gói. Trên thực tế, System.Net.Http
gói này dường như được cập nhật gần đây nhất (trong vài năm)
Đố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. "
Microsoft.Net.Http
yêu cầu Microsoft.Bcl
phụ 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.Http
thì rất tốt. Nếu không, Microsoft.Net.Http
sẽ là lựa chọn tốt hơn vì nó có thể là thế hệ tiếp theo.
System.Net.Http
phụ thuộc vàoMicrosoft.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.