【问题标题】:Resolving conflicting version requirements for NewtonSoft.Json解决 NewtonSoft.Json 的冲突版本要求
【发布时间】:2019-01-10 08:42:33
【问题描述】:

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

我有一个相对较旧的 asp.net 网络表单网站。它依赖于 .Net Framework 4.6 分析程序集,而后者又依赖于 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。

我觉得自己被困在一块石头和一个坚硬的地方之间。我可以让我的分析工作或我的日志记录工作,但我不能同时工作。关于 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>

【问题讨论】:

    标签: json.net assemblybinding


    【解决方案1】:

    我对这个答案并不完全满意,但它似乎确实有效。我阅读了有关此主题的更多帖子,特别是有关与 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 实用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 2015-07-02
      • 2018-10-26
      • 2017-02-09
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      相关资源
      最近更新 更多