解决NewtonSoft.Json

时间:2018-08-02 14:21:32

标签: json.net assemblybinding

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

我有一个相对较旧的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。

当我尝试在网站上使用新的日志记录帮助程序组件时,在运行时,日志记录失败,原因是它无法加载v6.0.0.0的NewtonSoft.Json或其依赖项之一。

如果我将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(分析)工作,又可以从事日志记录工作,但不能同时工作。关于以下方面的任何建议:a)寻求解决方案的方向-使我的Google Analytics(分析)组件接受较旧的版本,或者使我的日志记录组件与较新的版本一起使用;以及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>

1 个答案:

答案 0 :(得分:0)

我对这个答案并不完全满意,但是它确实起作用了。我通读了有关该主题的其他几篇文章,特别是有关与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实用程序。