【问题标题】:System.Net.Http vs Microsoft.Net.HttpSystem.Net.Http 与 Microsoft.Net.Http
【发布时间】:2015-09-12 05:32:27
【问题描述】:

我正在使用 ASP.NET Core。我想使用HttpClient,但我注意到提供了两个 NuGet 包。我用哪一个?

【问题讨论】:

  • 看起来System.Net.Http 依赖于Microsoft.Net.Http。但话又说回来,这取决于您要对您的应用程序做什么。

标签: c# asp.net-core nuget asp.net-core-mvc httpclient


【解决方案1】:

取决于版本。旧的 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
    }
  }
}

【讨论】:

  • 请注意,它们的行为并不完全相同。完整的 .NET 版本 (4.0.0.0) 不进行自动压缩,而 .NET Core 版本 (4.1.0) 可以。因此,如果您使用完整的 .NET 版本,则必须手动配置处理程序以使用 gzip/deflate 压缩。描述:github.com/dotnet/docs/issues/1054
  • 这个答案总结了 .NET Core、.NET Standard 和 .NET Framework 造成的混乱。
  • @vincent 当人们使用单声道等时,它并不比背部更痛苦。多平台总是有一些痛点。
  • 我没有看到“旧版软件包,System.Net.Http 现在包含在 Microsoft.Net.Http 软件包中。”您在包描述中所指的语言。事实上,System.Net.Http 包似乎是最近更新的(几年)
  • @DanEsparza 如果您查看the link I posted,您将看到该消息。我还提到只有 old 包(2.0 包)被弃用。最新的 4.x.x 包确实是最新的,你应该使用它们。
【解决方案2】:

对于任何对此感兴趣的人,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 中的内置版本。”

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

【讨论】:

    【解决方案3】:

    Microsoft.Net.Http 需要额外的 Microsoft.Bcl 依赖项。

    为此,如果您只针对 .NET Framework 或 .NET Core,System.Net.Http 是不错的选择。否则,Microsoft.Net.Http 会是更好的选择,因为它可能是下一代。

    【讨论】:

    • 似乎 MS 改变了主意,因为这篇文章暗示...stackoverflow.com/questions/39016373/…microsoft.net.http 自 2015 年以来没有更新,而 system.net.http 只是几个月的西米( nuget)。
    猜你喜欢
    • 2016-12-25
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多