发现 System.Net.Http 之间存在冲突

Found conflicts between System.Net.Http

我的 VS 解决方案中有几个项目。每当我将 "System.Net.Http" NuGet 包添加到其中时,它都会显示为版本 4.2.0.0。然后我做同样的事情并添加相同的 NuGet 包,但是,另一个说的是版本。 4.1.1.2

然后我收到警告:

Found conflicts between System.Net.Http

编辑 1:

Gathering dependency information took 1.7 sec
Attempting to resolve dependencies for package 'System.Net.Http.4.3.3' with DependencyBehavior 'Lowest'
Resolving dependency information took 0 ms
Resolving actions to install package 'System.Net.Http.4.3.3'
Resolved actions to install package 'System.Net.Http.4.3.3'
Retrieving package 'System.Net.Http 4.3.3' from 'nuget.org'.
Adding package 'System.Net.Http.4.3.3' to folder 'C:\...Service\packages'
Added package 'System.Net.Http.4.3.3' to folder 'C:\...Service\packages'
Added package 'System.Net.Http.4.3.3' to 'packages.config'
Successfully installed 'System.Net.Http 4.3.3' to ....Service
Executing nuget actions took 2.05 sec
Time Elapsed: 00:00:03.8937113

请注意安装了正确的版本,但是 => 道具 => 版本说 4.1.1.2

您可以强制安装您正在安装的版本,这样您就可以使两个项目保持一致或在输出中找到一条消息 window,它会告诉您哪里出了问题或您的依赖项是什么。 由于 official link 没有列出 4.2 版本,我会这样做 (solution-wide)

Install-Package System.Net.Http -Version 4.1.1

或两个项目

Get-Project ProjectName | Install-Package System.Net.Http -Version 4.1.1

或者,甚至更好(使用最新版本)

Install-Package System.Net.Http -Version 4.3.3

编辑

Apparently you are not the first to experience this。 答案 here 怎么样? 基本上你可以对齐 both 项目配置文件的这一部分:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" />
        <bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.2.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

您可能需要调整令牌值。 以防万一,你能不能把两个项目的配置文件都贴上=

当您引用了框架 System.Net.Http,但您的其中一个包引用需要 NuGet 包时,往往会发生这种情况 System.Net.Http。

看看您是否有对该程序集的引用,将其删除并改为安装 NuGet 包

编辑:只有在使用 .NET Framework 时才会发生这种情况。在 .NET Core/Standard 领域,最新的 System.Net.Http 程序集版本似乎总是 4.1.2.0 - 没有可用的 4.2.0.0 版本。

关于 System.Net.Http 的问题是 方式,方式 比这里的答案似乎暗示...

更复杂
  1. 是的,有一个 System.Net.Http NuGet 包,但是没有,它将 不会 安装同一程序集的最新版本(它包含 4.1.1.2 版的System.Net.Http 程序集,而不是 4.2.0.0)。
    19Mar2022 更新:最新的 NuGet 包版本 4.3.4 有程序集版本 4.1.1.3,程序集版本 4.2.0.0 仍然没有直接安装。
  2. 最新的 Microsoft Visual Studio(或 Microsoft Visual Studio Build Tools)提供版本 4.2.0.0,但这 意味着您的 .csproj 将始终使用它...
  3. 出于某种原因(我还无法理解),唯一保证使用 4.2.0.0 的方法是引用某些使用它的 NuGet 包,例如我们 System.Buffers(版本 4.5.0为我工作)。

长话短说:

添加 System.Buffers 4.5.0+ NuGet 引用到你的项目,如果你想确保它正在使用 System.Net.Http 4.2.0.0 程序集。

参考文献:

在查看了此处提供的所有解决方案和 中引用的参考资料后,我终于彻底解决了这个问题。我相信任何遇到此问题的人都应该这样做:

  1. 将所有 NuGet 包更新到最新。
  2. 按照说明 here 将 NuGet 从 packages.config 迁移到 PackageReference。基本上,对于解决方案中的每个项目,在解决方案资源管理器中,右键单击 References 节点或 packages.config 文件和 select 迁移 packages.config 到 PackageReference...。 ASP.NET 网站项目必须继续使用 packages.config.
  3. 删除任何不受 NuGet 管理的对 System.Net.Http 的引用(对于使用 PackageReference 的项目,您应该在解决方案资源管理器中的参考)。如果您确定您的项目需要 System.Net.Http(请先尝试在没有它的情况下进行构建),请将已删除的 System.Net.Http 引用替换为相应的 NuGet 包。对于使用 packages.config 的项目,请格外小心,确保需要引用 System.Net.Http 并且它们也在使用 NuGet。它可能有助于通过 NuGet 删除和重新添加 System.Net.Http(对于引用它的 all 项目),即使已经使用 NuGet 引用了。我发现第 2 步可能会导致某处脱节。
  4. 出于描述的原因升级到 .NET Framework 4.7.2 here. This is part of VS 2019. Otherwise, download it from here 或使用 Visual Studio VS 2017 安装程序。
  5. 从所有 app.configWeb.config[= 中删除 所有 程序集绑定49=] 文件,然后构建您的解决方案。 app.config 不再需要绑定。 Web.config 绑定将在下一步中重新添加,但首先删除它们可确保您的绑定中没有任何过时的版本。
  6. 您现在可能会在此阶段遇到一些其他冲突。对于您的 ASP.NET 网站项目,将绑定重定向添加到警告中提供给您的 Web.config。对于其他 .NET Framework 应用程序,对于收到警告的引用,请在收到警告的项目中添加相应的 NuGet 包,即使项目编译时没有添加引用也是如此。这会强制项目使用 NuGet 版本,而不是可能被另一个包引用的本地 .NET Framework 版本。这是由于 .NET Framework 和 .NET Standard 之间的交叉,正如 rsenna 的 所暗示的那样。构建后,您可能需要重复此步骤以获取更多参考。

如果您后来发现由于在某处添加引用后明显不匹配而出现 运行 次异常(即使在单元测试期间),请从相关网站项目中删除所有绑定重定向,然后重新根据步骤 6 添加警告中给出的建议。

我花了很多时间试图有条不紊地解决这个问题,所以我相信上述步骤可以完全解决大多数人的问题,尽管对于特殊情况可能需要一些横向思考。让我知道这对您是否有效(或无效)。

自 2018 年 10 月 9 日起,此问题有一个新的解决方案。

  1. 您需要将对 System.Net.Http 的所有引用更新到最新版本 4.3.4。
  2. 您应该将该包安装到导致冲突的 .Net 框架解决方案中,即使它没有明确要求该包。
  3. 如果您的项目具有新的项目结构,请编辑它并确保它包含以下包引用:

    <PackageReference Include="System.Net.Http" Version="4.3.4" />
    
  4. 搜索您的解决方案并删除 System.Net.Http 的任何现有绑定重定向,它们将如下所示

    <dependentAssembly>
      <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
    </dependentAssembly>
    
  5. 重建,警告现在应该消失了,你的代码应该可以构建并且运行很好

上面 Neo posted 的 6 个步骤帮助我解决了我的 ASP.NET 包问题!谢谢尼奥!我处理这个问题已经一个多星期了。

我只想分享我在实施 Neo post 上面的经验中的个人笔记。

我有一个针对 .Net Framework 4.6.1 的 ASP.NET Web API 项目

这是我所做的:

  • 升级到 .Net Framework 4.7.2
  • 将所有 NuGet 包更新到最新。
  • (可选,也可以执行 "update-package -reinstall" 以确保所有包都与 4.7.2 关联)
  • 合并包裹
  • 我没有从 packages.config 迁移到 PackageRefence,因为你不能在 ASP.NET
  • 删除了 System.Net.Http 和其他需要它的引用,并将它们添加为 NuGet 包。
  • 从 web.config 和 app.config 中删除了所有程序集绑定(在 .Core、.Tests、.IntegrationTests 库中)
  • 为版本号以文本 (n.n.n.n-beta) 结尾的 in-house NuGet 包添加了绑定重定向,但删除了文本且只有数字 (n.n.n.n)
  • 将此添加到所有 .csproj 文件:
<PropertyGroup>
  <AutoUnifyAssemblyReferences>true</AutoUnifyAssemblyReferences>
</PropertyGroup>
  • 确保所有 packages.config 文件中的包在解决方案的所有项目中具有相同的版本
    • 确保 web.config
    • 中的版本相同
    • 确保 .csproj 文件中的版本相同(如果适用)
  • 使用Microsoft.Net.Compilers 3.1.1(更新解决方案中的所有.csproj文件,包括.Tests和.IntegrationTests)
  • 对于使用 Redis 的数据保护 API (DPAPI):
    • 安装Microsoft.AspNetCore.DataProtection.StackExchangeRedis 2.2.5
    • StackExchange.Redis 2.0.601
    • 将 System.Numerics.Vectors 更新到 4.4.0(注意:4.5.0 中有一个阻止服务器连接的错误)

我在使用 Azure Worker 角色时遇到过两次这个问题。任何对 system.net.http simple 的调用都会导致代码挂起,但 Azure 根本没有任何反馈,因此需要数小时或数天的时间来注释掉代码才能找到原因,更不用说解决方案了。

一个简单的技巧帮我解决了这个问题。这不是我的解决方案,大约 6 个月前我遇到了它,但是当今天问题再次发生在我身上时,我认为值得发布。

  1. 从您的项目中删除对 System.Net.Http 的所有引用
  2. 转到"C:\Program Files (x86)\Microsoft Visual Studio19\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib"
  3. 创建一个新目录,例如"temphide"
  4. 将所有 System.Net.* DLL 移动到此目录
  5. 现在部署时,项目将使用Nuget版本,不再有冲突

我正在使用 .NET 4.6.2 并发现了同样的问题。我有两个项目,一个网站和一个测试项目。我评论了以下内容:

  • 两个项目都为 System.Net.Http

  • 安装了 NuGet 包
  • 两个程序中的引用是相等的并且都指向同一个
    包裹

问题。项目中的 Web.Config 和 App.Config 指向不同的 System.NET.Http。

我将两个配置中的代码替换为:

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.1.3" newVersion="4.1.1.3" />
  </dependentAssembly>

在他们两个。然后冲突就消失了。

我尝试了各种解决方案(删除 dependentAssembly 或指定绑定重定向)。 None 他们工作了。

但是,唯一对我有用的解决方案是将 System.Net.Http 的特定版本(或任何给您版本问题的 DLL)从 Visual Studio.

显式设置为 False

只需从不同的 projects/Class 库中删除 system.net.http 引用,然后重新添加引用。