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

时间:2018-02-19 12:38:17

标签: c# .net nuget service-fabric-stateful

我的VS解决方案中有几个项目。每当我添加" System.Net.Http" NuGet包显示为版本4.2.0.0。然后我也这样做并添加相同的NuGet包,然而,另一个说版本。 4.1.1.2

enter image description here enter image description here

然后我收到警告:

  

在System.Net.Http

之间发现冲突

EDIT1:

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

enter image description here

10 个答案:

答案 0 :(得分:28)

编辑:仅当使用.NET 框架时,才会发生这种情况。在.NET Core / Standard领域中,最新的System.Net.Http程序集版本似乎始终为4.1.2.0-没有可用的4.2.0.0版本。

与System.Net.Http有关的问题是方式,然后此处的答案似乎意味着...

  1. 是的,有一个System.Net.Http NuGet软件包,但没有,它将安装同一程序集的最新版本(它包含{{1}的4.1.1.2版}程序集,而不是4.2.0.0)。
  2. 最新的Microsoft Visual Studio(或Microsoft Visual Studio生成工具)提供版本4.2.0.0,但这并不意味着您的.csproj将始终使用它...
  3. 出于某种原因(我目前还无法理解),使用4.2.0.0的唯一保证方法是引用某些使用它的NuGet程序包,例如System.Net.Http(版本4.5.0适用于我)。

TL; DR:

如果要确保它使用的是System.Buffers 4.2.0.0程序集,请为项目添加System.Buffers 4.5.0+ NuGet参考。

参考文献:

答案 1 :(得分:8)

在经历了这里介绍的所有解决方案和this answer中引用的参考文献之后,我终于彻底解决了这个问题。我认为这是遇到此问题的任何人都应该做的:

  1. 将所有NuGet软件包更新为最新版本。
  2. 按照here的说明,将
  3. NuGet从 packages.config 迁移到 PackageReference 。基本上,对于解决方案中的每个项目,在解决方案资源管理器中,右键单击参考节点或 packages.config 文件,然后选择 Migrate packages.config to PackageReference ... 。 ASP.NET网站项目必须保留使用 packages.config
  4. 删除所有不是由NuGet管理的对System.Net.Http的引用(对于使用 PackageReference 的项目,您应该在解决方案资源管理器中的引用旁边看到NuGet符号enter image description here)。 。如果您确定项目需要System.Net.Http(请尝试在不使用它的情况下进行构建),则用相应的NuGet软件包替换已删除的System.Net.Http引用。对于使用 packages.config 的项目,请格外小心,以确保需要引用System.Net.Http并且它们也使用NuGet。无论如何,通过NuGet删除并重新添加System.Net.Http(对于引用它的 all 项目),即使已经使用NuGet进行了引用。我发现第2步可能会导致某些地方脱节。
  5. 出于here中所述的原因升级到.NET Framework 4.7.2。这是VS 2019的一部分。否则,请从here下载或使用Visual Studio Installer for VS 2017。
  6. 从所有 app.config Web.config 文件中删除 all 程序集绑定,然后构建解决方案。 app.config 绑定不再需要。 Web.config 绑定将在下一步中重新添加,但是首先删除它们将确保您的绑定中没有任何过时的版本。
  7. 您现在可能会在此阶段遇到其他冲突。对于您的ASP.NET网站项目,将绑定重定向添加到警告中提供给您的 Web.config 。对于其他.NET Framework应用程序,对于要获取警告的引用,请在要获取警告的项目中添加相应的NuGet程序包,即使项目在编译时未添加引用也是如此。这将迫使项目使用NuGet版本,而不是其他包可能引用的本地.NET Framework版本。这是由于rsenna的aforementioned answer暗示了.NET Framework和.NET Standard之间的交叉。构建后,您可能需要重复此步骤以获取更多参考。

如果以后发现在某个地方添加引用后由于清单不匹配而导致运行时异常(甚至在单元测试期间),请从相关的网站项目中删除所有绑定重定向,然后重新添加建议的按照步骤6发出警告。

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

答案 2 :(得分:7)

当你引用框架System.Net.Http时会发生这种情况,但是你的一个包引用需要NuGet包System.Net.Http。

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

答案 3 :(得分:4)

您可以强制安装您正在安装的版本,这样您就可以让两个项目保持一致或在输出窗口中找到一条消息,这将告诉您哪些错误或您的依赖项是什么。 由于official link没有列出4.2版本,我会这样做(解决方案范围内)

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怎么样? 基本上,您可以对齐两个项目配置文件的这一部分:

  <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>

您可能需要调整令牌值。 为了以防万一,您可以粘贴两个项目的配置文件=

答案 4 :(得分:2)

对此有一个新的解决方案,该解决方案将于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. 重建,警告现在应该消失了,您的代码应该可以正常构建并运行

答案 5 :(得分:1)

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

我只想分享我在实施Neo上面的帖子时的个人笔记。

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

这是我所做的:

  • 升级到.Net Framework 4.7.2
  • 将所有NuGet软件包更新为最新版本。
  • ((可选,也可以执行“ update-package -reinstall”以确保所有软件包都与4.7.2关联)
  • 合并软件包
  • 我没有从package.config迁移到PackageRefence,因为您不能在ASP.NET中使用
  • 从System.Net.Http和其他需要它的引用中删除了引用,并将它们添加为NuGet包。
  • 从web.config和app.config(在.Core,.Tests,.IntegrationTests库中)中删除了所有程序集绑定
  • 为我们内部的NuGet软件包添加了绑定重定向,这些软件包的版本号以文本(n.n.n.n-beta)结尾,但是删除了文本并且仅具有数字(n.n.n.n)
  • 将此添加到所有.csproj文件中:
<PropertyGroup>
  <AutoUnifyAssemblyReferences>true</AutoUnifyAssemblyReferences>
</PropertyGroup>
  • 确保所有package.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中存在一个错误,阻止服务器连接)

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:0)

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

但是,唯一对我有用的解决方案是从Visual Studio中将System.Net.Http的“特定版本”(或提供版本问题的任何DLL)显式设置为False。

enter image description here

答案 8 :(得分:0)

只需从不同的项目/类库中删除 system.net.http 引用并重新添加引用即可。

答案 9 :(得分:-2)

我正在使用.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>
他们两个都

。然后冲突消失了。