System.Net.Http与Microsoft.Net.Http


Answers:


64

取决于版本。旧System.Net.Http软件包(2.0软件包)是旧软件包,Microsoft.Http.Net根据说明不推荐使用:

传统包System.Net.Http现在包含在“ Microsoft.Net.Http”包中。

它们的存在是为了提供HttpClient.NET以前的版本和可移植类库。你应该用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
请注意,它们的行为不完全相同。完整的.NET版本(4.0.0.0)不会自动压缩,而.NET Core版本(4.1.0)会自动压缩。因此,如果您使用完整的.NET版本,则必须手动配置处理程序以使用gzip / deflate压缩。说明:github.com/dotnet/docs/issues/1054
Jeppe Andersen

28
这个答案总结了.NET Core,.NET Standard和.NET Framework的混乱情况。
文森特

1
@vincent当人们使用mono等时,这比在屁股上痛苦更大。Multi平台总是有一些痛苦点。
轧辊

4
我看不到“旧版软件包,System.Net.Http现在已包含在其中Microsoft.Net.Http”。包说明中所指的语言。实际上,该System.Net.Http软件包似乎是最新的(已更新了几年)
Dan Esparza,

2
@DanEsparza,如果您查看我发布的链接,则会看到该消息。我还提到过时,仅软件包(2.0软件包)已弃用。最新的4.xx软件包确实是最新的,您应该使用它们。
Henk Mollema

19

对于对此感兴趣的人,Immo Landwerth(Microsoft .NET上的程序经理)在推特上发布了以下内容:

“ 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


8

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

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


8
似乎MS改变了主意,因为这篇文章暗示... stackoverflow.com/questions/39016373 / ... microsoft.net.http自2015年以来未进行更新,而system.net.http只是几个月的西谷(nuget) 。
smoore4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.