我正在使用ASP.NET Core。我想使用HttpClient
,但我注意到提供了两个NuGet包。我使用哪一个?
答案 0 :(得分:54)
取决于版本。旧System.Net.Http
个软件包(2.0个)是旧版软件包,根据描述不推荐使用Microsoft.Http.Net
:
传统包,System.Net.Http现在包含在 ' Microsoft.Net.Http'封装
它们的存在是为了在以前的.NET版本和可移植类库中提供HttpClient
。在这种情况下你应该使用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和.NET Core,则必须将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 :(得分:7)
对于对此有更多背景知识的人,请 Immo Landwerth (Microsoft .NET上的程序经理)tweeted关于此事:
“ HttpClient最初是作为NuGet包(带外)开始的,并且也在4.5(内置)中添加到.NET Framework中。
使用.NET Core / .NET Standard,我们最初尝试将.NET平台建模为一组程序包,而不再需要内置或带外。但是,这比我们预期的更为混乱和复杂。
结果,我们在很大程度上放弃了将.NET平台建模为具有Core / Standard 2.0的NuGet图的想法。
一般的答案是:
使用.NET Core 2.0和.NET Standard 2.0,您根本不需要引用SystemNetHttpClient NuGet程序包。不过,它可能会从1.x依赖项中撤出。
.NET Framework也是如此:如果您的目标是4.5及更高版本,则通常应使用内置版本而不是NuGet软件包。再次,您可能最终将其引入.NET Standard 1.x和PCL依赖性,但直接针对.NET Framework编写的代码不应使用它。
那么为什么软件包仍然存在/为什么我们仍要更新它?仅仅因为我们想使现有的代码工作依赖于它。但是,您发现在.NET Framework上运行并不顺利。
旧版软件包的预期模型是:如果您使用.NET Framework 4.5 + 、. NET Core 2 + 、. NET Standard 2+中的软件包,则该软件包仅转发到平台提供的实现,而不是自带版本。
这并不是在所有情况下实际发生的情况:HTTP客户端程序包将(部分)替换.NET Framework上的内置组件,这些组件可能对某些客户有效而对其他客户而言无效。因此,我们现在无法轻松解决此问题。
最重要的是,.NET Framework存在常见的绑定问题,因此,仅当您添加绑定重定向时,它才能真正正常工作。是的!
因此,作为图书馆作者,我的建议是避免依赖于此程序包,而希望使用.NET Framework 4.5,.NET Core 2.0和.NET Standard 2.0中的内置版本。”
答案 2 :(得分:6)
Microsoft.Net.Http
需要额外的Microsoft.Bcl
个依赖项。
为此,如果您只是.NET Framework或.NET Core,那么System.Net.Http
就可以了。否则,Microsoft.Net.Http
将是更好的选择,因为它可能是下一代。