System.Net.Http与Microsoft.Net.Http

Muh*_*eed 74 c# httpclient nuget asp.net-core-mvc asp.net-core

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

Hen*_*ema 56

取决于版本.旧System.Net.Http软件包(2.0版)是遗留软件包,Microsoft.Http.Net根据描述不赞成使用:

Legacy包,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>
Run Code Online (Sandbox Code Playgroud)

如果您正在使用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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案总结了.NET Core,.NET Standard和.NET Framework的混乱局面. (24认同)
  • 我没有看到"Legacy包,`System.Net.Http`现在包含在`Microsoft.Net.Http`包中." 您在包描述中引用的语言.事实上,`System.Net.Http`包似乎是最近更新的(几年) (3认同)
  • @DanEsparza如果您查看[我发布的链接](https://www.nuget.org/packages/System.Net.Http/2.0.20710),则会看到该消息。我还提到过,仅* old *软件包(2.0软件包)已弃用。最新的4.xx软件包确实是最新的,您应该使用它们。 (2认同)

Dan*_*plo 12

对于有更多背景知识的人,Immo Landwerth(微软.NET项目经理)在Twitter上发布了这样的信息:

"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


You*_*jae 6

Microsoft.Net.Http需要额外的Microsoft.Bcl依赖关系.

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

  • 似乎MS改变了主意,因为这篇文章提到了...... /sf/ask/2731146141/ microsoft. net.http自2015年以来一直没有更新,而system.net.http只是几个月的西米(nuget). (8认同)