解决 NewtonSoft.Json 的冲突版本要求

Resolving conflicting version requirements for NewtonSoft.Json

我已经阅读了几篇关于程序集绑定问题的帖子,并尝试了很多建议的解决方案,但都没有成功。

我有一个相对较旧的 asp.net 网络表单网站。它依赖于 .Net Framework 4.6 Analytics 程序集,而后者又依赖于 NewtonSoft.Json。该 Analytics 程序集是我们自己的程序集之一,是使用 NewtonSoft.Json v7.0.1 构建的。这是驻留在网站的 bin 文件夹中的程序集的版本。

我有一个较新的网站,一个 Angular SPA,它依赖于 .Net Framework WebApi 服务。这些服务依赖于调用单独日志记录服务的日志记录助手组件。日志助手组件依赖于 Microsoft.AspNet.WebApi.Client 来进行服务调用,这依赖于 System.Net.Http.Formatting,这依赖于 NewtonSoft.Json v6.0.4。

当我尝试在网站中使用新的日志记录助手组件时,在运行时,日志记录失败,提示无法加载 NewtonSoft.Json 的 v6.0.0.0 或其依赖项之一。

如果我将 v7.0 文件放到网站 bin 文件夹中,网站将失败,因为 Analytics 程序集无法加载 NewtonSoft.Json 的 v7.0.0.0 或其依赖项之一。

理想情况下,我希望 Microsoft.AspNet.WebApi.Client 和 System.Net.Http.Formatting 能与更新版本的 NewtonSoft.Json 很好地配合使用,但我无法控制这些程序集的播放方式。我已经尝试使用 NewtonSoft.Json v6.0.4 重建我的 Analytics 组件,但是当它被构建和部署时,不知何故在 Web 服务器上它仍然最终寻找 v7.0.0.0。

我觉得自己进退两难。我可以让我的 Analytics 工作或让我的 Logging 工作,但我不能让两者都工作。关于 a) 寻求解决方案的方向的任何建议 - 让我的 Analytics 组件接受旧版本或让我的 Logging 组件与新版本一起工作,以及 b) 如何完成这些方法中的任何一个?

更新 1 - 我尝试过的一些超出我上面描述的事情: 在我的日志记录助手组件 .csproj 项目文件中,我尝试从 NewtonSoft.Json 引用中删除版本信息。我用 NewtonSoft.Json v7.0 文件将它部署到网站上,但它仍然失败,说它无法加载 v6.0。 我尝试使用 fuslogvw.exe,程序集绑定日志查看器。也许我没有正确使用它,但我可以重现我的程序集绑定错误并且在程序集绑定日志查看器中什么也看不到。

更新 2 - 我尝试在我的日志记录助手组件中添加程序集绑定重定向,将其从 6.0.0.0 重定向到 7.0.0.0,但是当我构建该组件并将其放入网站 bin 文件夹时,该文件夹现在有NewtonSoft.Json 7.0 文件,记录器仍然无法说明它可以加载 v6.0.0.0。有没有办法摆脱这个?

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="NewtonSoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
    <bindingRedirect oldVersion="6.0.0.0"
                     newVersion="7.0.0.0" />
  </dependentAssembly>
</assemblyBinding>

更新 3 - 下面是来自日志助手组件的 packages.config。我相信 packages.config 中的所有内容都是基于我添加 Microsoft.AspNet.WebApi.Client 包。根据 NuGet 上的包信息,它应该与 NewtonSoft.Json >= 6.0.4 一起使用,但它总是无法找到 6.0.0.0。

<packages>
    <package id="Microsoft.AspNet.WebApi.Client" version="5.2.6" targetFramework="net461" />
    <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.5" targetFramework="net461" />
    <package id="Microsoft.Net.Compilers" version="2.4.0" targetFramework="net461" developmentDependency="true" />
    <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net461" />
    <package id="System.Net.Http" version="2.0.20126.16343" targetFramework="net461" />
</packages>

我对这个答案并不完全满意,但它确实有效。我阅读了更多关于这个主题的帖子,特别是关于 NewtonSoft.Json 的版本冲突问题的帖子,这些帖子似乎经常发生冲突。在 this article 中,有几个人报告说程序集绑定重定向只有在 machine.config 中才有效。我一直在尝试在我的日志记录助手组件配置文件中添加程序集绑定重定向。我现在意识到,因为我有一个运行时绑定错误,我需要处理运行时应用程序的配置,即网站。但是将绑定重定向添加到 web.config 似乎没有效果,而将它们添加到 machine.config 则有效。不幸的是,它破坏了服务器上需要不同版本的其他应用程序。所以...有点答案,但还没有完全解决。这是绑定重定向,当添加到 Web 服务器上的 machine.config 时,它会使日志记录助手组件在网站中正常工作。

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="NewtonSoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
    <bindingRedirect oldVersion="6.0.0.0" newVersion="7.0.0.0" />
  </dependentAssembly>
</assemblyBinding>
</runtime>

但我仍然需要弄清楚如何让服务器上的其他应用程序正常工作。这个问题似乎永远不会结束。

更新:我有一个可行的解决方案,至少在我的开发和测试环境中是这样。解决方案包括如上所述的 machine.config 中的程序集绑定重定向,以及将所需版本的程序集安装到全局程序集缓存 (GAC) 中,以便服务器上的所有应用程序都可以使用它。

这不是我最喜欢的解决方案,我仍然很乐意听到替代方案,但就目前而言,这就是我所拥有的,而且似乎有效。剩下的唯一问题是在未安装 Visual Studio 或 Windows SDK 的生产服务器上将程序集放入 GAC - 因此没有 gacutil.exe 实用程序。