Azure 云服务:System.Net.Http.Formatting.dll request old Newtonsoft.Json.dll -> 角色初始化失败



我有相当大的解决方案,大约有 80 个项目,使用 WebAPI (v1( 作为 Web 角色在 Azure 云服务服务器上运行。我通过实施自定义JsonReader/Writer创建了有关内容协商的新增强功能。当我尝试通过基于BaseJsonMediaTypeFormatter实现自定义MediaTypeFormatter来使用它时,它会失败 - 准确地说,它在发布到 Azure 时失败。本地模拟它完美运行。发布后,它将失败为:

...
Role entrypoint could not be created: System.TypeLoadException: Unable to load the role entry point due to the following exceptions:
-- System.IO.FileLoadException: Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'
=== Pre-bind state information ===
LOG: DisplayName = Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
(Fully-specified)
LOG: Appbase = file:///E:/approot/bin
LOG: Initial PrivatePath = E:approotbin
Calling assembly : System.Net.Http.Formatting, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
...

(从 EventViewer->Application and Services log->Windows Azure 捕获的日志(。

直到我尝试使用我的自定义MediaTypeFormatter一切正常。我已经在互联网和SO上搜索了一些解决方案,尽管这个问题并不像我认为的那样罕见,但没有任何解决方案对我有帮助。我试过什么:

  • 整合所有引用项目中Newtonsoft.JsonNuget 的所有版本
  • 合并了Microsoft.AspNet.WebApi.ClientNuGet 的所有版本
  • 删除了对上述两个库的所有引用,并通过引用 NUGET 来替换这些对 DLL 的引用
  • 将两个 Nuget 包升级到最新版本(Json 12.0.3 和格式化 5.2.7((我什至尝试在Update-Package命令中使用 -reinstall 参数(
  • 手动检查所有csproj以引用旧Newtonsoft.Json版本。
  • 清理解决方案,bin,obj文件夹,所有缓存文件
  • 我的web.config文件包含(并且一直包含(正确的bindingRedirectNewtonsoft.Json
  • (可能还有其他一些东西,我已经忘记了(

没有任何解决方案有效,我仍然收到这条奇怪的消息。 我的问题是:

  • 当我明确说它应该重定向到第 12 版时,System.Net.Http.Formatting库需要某个特定版本的 Newtonsoft.Json 怎么可能?是因为它发生在Webrole启动期间(也许是因为它还没有尊重web.config?
  • 为什么它可以在我的计算机上工作,但不能部署在 Azure 云服务上?它是否以某种方式在我的本地计算机上找到并使用了Newtonsoft.Json lib的旧版本(以及在哪里,因此我可以尝试删除它(?
  • 有没有更好的方法来调试此问题?也许记录加载引用的 DLL 的顺序以更接近错误?还是在本地计算机上复制错误?目前,部署应用程序、登录远程桌面并检查云服务上的事件查看器非常耗时......

任何查找问题的提示将不胜感激。

您非常接近具有 web.config 程序集绑定的解决方案。 但是,错误消息显示"无法加载角色入口点"。 您的角色入口点是托管 OnStart/Run 方法的二进制文件(即WebRole1.dll(,它不同于 IIS 中承载的网站内容。

若要解决此问题,请打开位于项目 bin 文件夹中的 .dll.config 并使用相同的程序集绑定信息,然后重新部署服务。

有关更多详细信息,请参阅 https://learn.microsoft.com/en-us/archive/blogs/cie/cloud-services-roles-recycling-with-the-error-system-io-fileloadexception-could-not-load-file-or-assembly。

最新更新