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



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

我有一个比较旧的asp.net表单网站。它依赖于.Net Framework 4.6分析程序集,而该程序集又依赖于NewtonSoft.Json。该分析程序集是我们自己的程序集,由NewtonSoftJson v7.0.1构建。这是驻留在网站bin文件夹中的程序集的版本。

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

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

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

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

我觉得自己陷入了进退两难的境地。我可以让我的分析工作或日志工作,但我不能两者都工作。关于a)解决方案的方向——让我的分析组件接受旧版本,或者让我的日志记录组件使用新版本,以及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版本冲突的帖子,这似乎经常发生冲突。在这篇文章中,有几个人报告说,程序集绑定重定向只有在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实用程序。

最新更新