System.Net.Http 对比 Microsoft.Net.Http
System.Net.Http vs Microsoft.Net.Http
我正在使用 ASP.NET Core。我想使用 HttpClient
但我注意到提供了两个 NuGet 包。我用哪一个?
取决于版本。旧 System.Net.Http
包(2.0 ones) are legacy packages which are deprecated in favor of Microsoft.Http.Net
根据描述:
Legacy package, System.Net.Http is now included in the
'Microsoft.Net.Http' package.
它们的存在是为了提供以前 .NET 版本中的 HttpClient
和可移植 Class 库。在这种情况下,您应该使用 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
}
}
}
Microsoft.Net.Http
需要额外的 Microsoft.Bcl
依赖项。
为此,如果您只针对 .NET Framework 或 .NET Core,System.Net.Http
是个不错的选择。否则,Microsoft.Net.Http
会是更好的选择,因为它可能是下一代。
任何对此背景感兴趣的人,Immo Landwerth(Microsoft 的 .NET 项目经理)tweeted 关于这个:
"HttpClient 最初是作为 NuGet 包 (out-of-band) 并在 4.5 中添加到 .NET Framework 中 (in-box)。
对于 .NET Core/.NET Standard,我们最初尝试将 .NET 平台建模为一组包,其中 in-box 与 out-of-band 不再重要。然而,这比我们预期的更混乱、更复杂。
因此,我们在很大程度上放弃了使用 Core/Standard 2.0 将 .NET 平台建模为 NuGet 图的想法。
一般答案是:
有了 .NET Core 2.0 和 .NET Standard 2.0,您根本不需要引用 SystemNetHttpClient NuGet 包。不过,它可能会从 1.x 依赖项中提取出来。
.NET Framework 也是如此:如果您的目标是 4.5 及更高版本,您通常应该使用 in-box 版本而不是 NuGet 包。同样,您最终可能会为 .NET Standard 1.x 和 PCL 依赖项引入它,但是直接针对 .NET Framework 编写的代码不应该使用它。
那么为什么这个包还在exist/why我们还要更新吗?仅仅是因为我们想让现有的代码工作依赖于它。但是,正如您发现的那样,在 .NET Framework 上并非一帆风顺。
遗留包的预期模型是:如果您使用来自 .NET Framework 4.5+、.NET Core 2+、.NET Standard 2+ 的包,则包仅转发到平台提供的实现,而不是带来它是自己的版本。
但这并不是在所有情况下实际发生的情况:HTTP 客户端包将(部分)替换 .NET Framework 上的 in-box 组件,这些组件恰好适用于某些客户而对其他客户则失败。因此,我们现在无法轻易解决这个问题。
除此之外,我们还存在与 .NET Framework 的常见绑定问题,因此只有添加绑定重定向才能真正发挥作用。耶!
因此,作为库作者,我的建议是避免依赖此包,而更喜欢 .NET Framework 4.5、.NET Core 2.0 和 .NET Standard 2.0 中的 in-box 版本。"
我正在使用 ASP.NET Core。我想使用 HttpClient
但我注意到提供了两个 NuGet 包。我用哪一个?
取决于版本。旧 System.Net.Http
包(2.0 ones) are legacy packages which are deprecated in favor of Microsoft.Http.Net
根据描述:
Legacy package, System.Net.Http is now included in the 'Microsoft.Net.Http' package.
它们的存在是为了提供以前 .NET 版本中的 HttpClient
和可移植 Class 库。在这种情况下,您应该使用 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
}
}
}
Microsoft.Net.Http
需要额外的 Microsoft.Bcl
依赖项。
为此,如果您只针对 .NET Framework 或 .NET Core,System.Net.Http
是个不错的选择。否则,Microsoft.Net.Http
会是更好的选择,因为它可能是下一代。
任何对此背景感兴趣的人,Immo Landwerth(Microsoft 的 .NET 项目经理)tweeted 关于这个:
"HttpClient 最初是作为 NuGet 包 (out-of-band) 并在 4.5 中添加到 .NET Framework 中 (in-box)。
对于 .NET Core/.NET Standard,我们最初尝试将 .NET 平台建模为一组包,其中 in-box 与 out-of-band 不再重要。然而,这比我们预期的更混乱、更复杂。
因此,我们在很大程度上放弃了使用 Core/Standard 2.0 将 .NET 平台建模为 NuGet 图的想法。
一般答案是:
有了 .NET Core 2.0 和 .NET Standard 2.0,您根本不需要引用 SystemNetHttpClient NuGet 包。不过,它可能会从 1.x 依赖项中提取出来。
.NET Framework 也是如此:如果您的目标是 4.5 及更高版本,您通常应该使用 in-box 版本而不是 NuGet 包。同样,您最终可能会为 .NET Standard 1.x 和 PCL 依赖项引入它,但是直接针对 .NET Framework 编写的代码不应该使用它。
那么为什么这个包还在exist/why我们还要更新吗?仅仅是因为我们想让现有的代码工作依赖于它。但是,正如您发现的那样,在 .NET Framework 上并非一帆风顺。
遗留包的预期模型是:如果您使用来自 .NET Framework 4.5+、.NET Core 2+、.NET Standard 2+ 的包,则包仅转发到平台提供的实现,而不是带来它是自己的版本。
但这并不是在所有情况下实际发生的情况:HTTP 客户端包将(部分)替换 .NET Framework 上的 in-box 组件,这些组件恰好适用于某些客户而对其他客户则失败。因此,我们现在无法轻易解决这个问题。
除此之外,我们还存在与 .NET Framework 的常见绑定问题,因此只有添加绑定重定向才能真正发挥作用。耶!
因此,作为库作者,我的建议是避免依赖此包,而更喜欢 .NET Framework 4.5、.NET Core 2.0 和 .NET Standard 2.0 中的 in-box 版本。"