首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决NewtonSoft.Json的版本要求冲突

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

Stack Overflow用户
提问于 2018-08-02 22:21:32
回答 1查看 295关注 0票数 1

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

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

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

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

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

理想情况下,我希望Microsoft.AspNet.WebApi.Client和System.Net.Http.Formatting能够很好地处理较新版本的NewtonSoft.Json,但我对这些程序集的处理方式没有太多的控制。我尝试过用NewtonSoft.Json v6.0.4重新构建我的分析组件,但当它被构建和部署时,不知何故在web服务器上,它仍然在寻找v7.0.0.0。

我觉得我就像被困在一块石头和一个硬地方之间。我可以让我的分析工作或我的日志记录工作,但我不能让两者都工作。关于a)解决方案的方向-让我的Analytics组件接受旧版本或让我的日志记录组件与新版本一起工作,以及b)如何实现这两种方法,有什么建议吗?

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

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

代码语言:javascript
复制
<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总是失败。

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-04 02:16:05

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

代码语言:javascript
复制
<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中的程序集绑定重定向,以及将所需版本的程序集安装到全局程序集缓存中,以便它可供服务器上的所有应用程序使用。

这不是我最喜欢的解决方案,我仍然很高兴听到替代方案,但现在,这就是我所拥有的,它似乎起作用了。剩下的唯一问题是在没有安装Visual Studio或Windows SDK的生产服务器上将程序集放入GAC中-因此没有gacutil.exe实用程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51655950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档