【问题标题】:Azure cloud service: System.Net.Http.Formatting.dll requests old Newtonsoft.Json.dll -> role initialization failsAzure 云服务:System.Net.Http.Formatting.dll 请求旧的 Newtonsoft.Json.dll -> 角色初始化失败
【发布时间】:2020-07-21 23:54:05
【问题描述】:

我有大约 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:\approot\bin
Calling assembly : System.Net.Http.Formatting, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
...

(从 EventViewer 捕获的日志->应用程序和服务日志->Windows Azure)。

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

  • 在所有引用项目中合并所有版本的 Newtonsoft.Json nugets
  • 整合了Microsoft.AspNet.WebApi.Clientnuget的所有版本
  • 删除了对这两个库的所有引用,并通过引用 nuget 替换了这些对 dll 的引用
  • 将两个 Nuget 包升级到最新版本(Json 12.0.3 和 Formatting 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 的顺序以更接近错误?或者在我的本地计算机上复制错误?目前部署应用程序、登录远程桌面并查看云服务上的 EventViewer 非常耗时...

任何发现问题的提示将不胜感激。

【问题讨论】:

  • 99.9% 您部署的服务具有既不是 6 也不是 12.0.3 的 Newtonsoft.Json 版本...向 all 项目添加对 Newtonsoft NuGet 的引用可能是解决方法。 ..
  • 刚刚试过 - 所有项目现在都引用 Newtonsoft.Json 12.0.3 Nuget,部署它,但它仍然说同样的错误:-(

标签: c# nuget azure-cloud-services dll-dependency


【解决方案1】:

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

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

更多详情请见https://docs.microsoft.com/en-us/archive/blogs/cie/cloud-services-roles-recycling-with-the-error-system-io-fileloadexception-could-not-load-file-or-assembly

【讨论】:

  • 这正是缺失的部分。谢谢,它有效。我只需要从 Web.config 旁边的 bin 文件夹中复制 *.dll.config 并包含在项目中,并将 CopyAlways 设置为输出文件夹。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 2016-03-17
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 2011-07-21
  • 2010-12-26
相关资源
最近更新 更多